From b7aa20f0adf36a92b595b3ba7aab3a560c996790 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Fri, 21 Aug 2026 16:00:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=86=E5=88=86=E6=89=93=E6=89=8B=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worker/WorkerProfileAccountModals.tsx | 225 ++ .../worker/WorkerProfileDesktopSections.tsx | 286 +++ .../worker/WorkerProfileFinanceModals.tsx | 393 ++++ .../pages/worker/WorkerProfileMobileView.tsx | 369 ++++ .../src/pages/worker/WorkerProfilePage.tsx | 1893 ++--------------- .../src/pages/worker/WorkerProfileRecords.tsx | 368 ++++ .../worker/worker-profile-view-utils.tsx | 259 +++ 7 files changed, 2118 insertions(+), 1675 deletions(-) create mode 100644 apps/frontend/src/pages/worker/WorkerProfileAccountModals.tsx create mode 100644 apps/frontend/src/pages/worker/WorkerProfileDesktopSections.tsx create mode 100644 apps/frontend/src/pages/worker/WorkerProfileFinanceModals.tsx create mode 100644 apps/frontend/src/pages/worker/WorkerProfileMobileView.tsx create mode 100644 apps/frontend/src/pages/worker/WorkerProfileRecords.tsx create mode 100644 apps/frontend/src/pages/worker/worker-profile-view-utils.tsx diff --git a/apps/frontend/src/pages/worker/WorkerProfileAccountModals.tsx b/apps/frontend/src/pages/worker/WorkerProfileAccountModals.tsx new file mode 100644 index 00000000..e79bff47 --- /dev/null +++ b/apps/frontend/src/pages/worker/WorkerProfileAccountModals.tsx @@ -0,0 +1,225 @@ +import { + Alert, + Button, + Descriptions, + Form, + Image, + Input, + Modal, + Space, + Table, + Typography, +} from 'antd' +import type { FormInstance } from 'antd' + +import type { WorkerFinanceConfig, WorkerSessionDevice, WorkerUser } from '@/types/worker-platform' +import { formatDateTime } from '@/utils/date-time' +import { isWorkerPasswordStrong, WORKER_PASSWORD_RULE_MESSAGE } from '@/utils/worker-password' + +import { formatMoney, formatWorkerStatus } from './worker-profile-view-utils' + +export type PasswordFormValues = { + currentPassword?: string + newPassword?: string + confirmPassword?: string +} + +export function WorkerProfileAccountModals({ + isMobile, + worker, + financeConfig, + devicesOpen, + setDevicesOpen, + devices, + maxDevices, + devicesLoading, + removeWorkerDevice, + passwordOpen, + setPasswordOpen, + submittingPassword, + passwordForm, + submitPasswordChange, + contactOpen, + setContactOpen, +}: { + isMobile: boolean + worker: WorkerUser | undefined + financeConfig: WorkerFinanceConfig | undefined + devicesOpen: boolean + setDevicesOpen: (open: boolean) => void + devices: WorkerSessionDevice[] + maxDevices: number + devicesLoading: boolean + removeWorkerDevice: (device: WorkerSessionDevice) => Promise + passwordOpen: boolean + setPasswordOpen: (open: boolean) => void + submittingPassword: boolean + passwordForm: FormInstance + submitPasswordChange: (values: PasswordFormValues) => Promise + contactOpen: boolean + setContactOpen: (open: boolean) => void +}) { + return ( + <> + setDevicesOpen(false)} + > + + + size="small" + loading={devicesLoading} + rowKey="sessionId" + dataSource={devices} + pagination={false} + style={{ marginTop: 16 }} + columns={[ + { + title: '设备', + render: (_, item) => ( + + {item.deviceName || item.deviceType} + {item.ipAddress || '未知 IP'} + + ), + }, + { title: '最近活动', render: (_, item) => formatDateTime(item.lastSeenAt) }, + { + title: '操作', + width: 100, + render: (_, item) => ( + + ), + }, + ]} + /> + + + { + setPasswordOpen(false) + passwordForm.resetFields() + }} + onOk={() => passwordForm.submit()} + > +
+ + + + + !value || isWorkerPasswordStrong(value) + ? Promise.resolve() + : Promise.reject(new Error(WORKER_PASSWORD_RULE_MESSAGE)), + }, + ]} + extra={WORKER_PASSWORD_RULE_MESSAGE} + > + + + ({ + validator(_, value) { + return !value || value === getFieldValue('newPassword') + ? Promise.resolve() + : Promise.reject(new Error('两次输入的新密码不一致')) + }, + }), + ]} + > + + +
+
+ + setContactOpen(false)}> + 我知道了 + + } + onCancel={() => setContactOpen(false)} + > + + + {financeConfig?.adminContact?.wechatQrCodeImage ? ( +
+ 管理员微信二维码 +
+ ) : ( + + 管理员暂未配置微信二维码,请按下方账号信息联系。 + + )} + + + {worker?.username || '-'} + + {worker?.displayName || '-'} + + {worker?.phone || '-'} + + + {formatWorkerStatus(worker?.status || '')} + + + {formatMoney(worker?.wallet.availableAmount)} + + + + 建议沟通时一起提供:申请类型、金额、订单号或转账备注、收款方式,以及当前账号信息。 + +
+
+ + ) +} diff --git a/apps/frontend/src/pages/worker/WorkerProfileDesktopSections.tsx b/apps/frontend/src/pages/worker/WorkerProfileDesktopSections.tsx new file mode 100644 index 00000000..02e906d5 --- /dev/null +++ b/apps/frontend/src/pages/worker/WorkerProfileDesktopSections.tsx @@ -0,0 +1,286 @@ +import { + BankOutlined, + CopyOutlined, + CustomerServiceOutlined, + GlobalOutlined, + LockOutlined, + LogoutOutlined, + WalletOutlined, +} from '@ant-design/icons' +import { Avatar, Button, Card, Descriptions, Progress, Space, Tag, Typography } from 'antd' + +import type { + WorkerLevelProgress, + WorkerProfileSummary, + WorkerUser, + WorkerWithdrawalAccount, +} from '@/types/worker-platform' +import { formatDateTime } from '@/utils/date-time' + +import { + formatMoney, + formatWorkerStatus, + formatWithdrawChannel, + resolveWorkerInitial, + resolveWorkerStatusColor, +} from './worker-profile-view-utils' + +export function WorkerProfileDesktopIdentity({ + worker, + summary, + levelProgress, + onCopyInviteCode, +}: { + worker: WorkerUser + summary: WorkerProfileSummary | undefined + levelProgress: WorkerLevelProgress | null | undefined + onCopyInviteCode: () => void +}) { + return ( + + + {resolveWorkerInitial(worker)} + + + {worker.displayName || worker.username} + + 账号:{worker.username} + 手机号:{worker.phone || '-'} + + + + {formatWorkerStatus(worker.status)} + + + {worker.workerType === 'internal' ? '内部打手' : '外部打手'} + + {worker.level?.name || '未分级'} + + + + + 我的邀请码: + {worker.inviteCode || '-'} + + + {levelProgress && levelProgress.nextThreshold !== null ? ( + + + 已累计完成 {summary?.acceptedOrderCount || 0} 单,距下一等级还需{' '} + {Math.max(0, levelProgress.nextThreshold - (summary?.acceptedOrderCount || 0))} 单 + + `${percent}%`} + /> + + ) : ( + + 已累计完成 {summary?.acceptedOrderCount || 0} 单,当前已是最高等级 + + )} + + + ) +} + +export function WorkerProfileDesktopWallet({ worker }: { worker: WorkerUser }) { + const items = [ + ['可用余额', worker.wallet.availableAmount, '可用于抢单冻结或提现申请'], + ['冻结押金', worker.wallet.frozenDepositAmount, '抢单后冻结,验收后进入待解冻'], + ['待解冻押金', worker.wallet.pendingUnfreezeAmount, '验收后按配置天数解冻到账'], + ['累计结算', worker.wallet.totalSettledAmount, '已结算入账的报酬合计'], + ] as const + return ( + +
+ {items.map(([label, amount, note]) => ( +
+ {label} + {formatMoney(amount)} + {note} +
+ ))} +
+
+ ) +} + +export function WorkerProfileDesktopActions({ + canUseFinanceActions, + canAddWithdrawalAccount, + needsAlipayQrCode, + onRecharge, + onWithdraw, + onAddWithdrawalAccount, + onAddAlipayQrCode, + onChangePassword, + onManageDevices, + onContact, + onLogout, +}: { + canUseFinanceActions: boolean + canAddWithdrawalAccount: boolean + needsAlipayQrCode: boolean + onRecharge: () => void + onWithdraw: () => void + onAddWithdrawalAccount: () => void + onAddAlipayQrCode: () => void + onChangePassword: () => void + onManageDevices: () => void + onContact: () => void + onLogout: () => void +}) { + return ( + + + + + {canAddWithdrawalAccount ? ( + + ) : null} + {needsAlipayQrCode ? ( + + ) : null} + + + + + + + ) +} + +export function WorkerProfileDesktopAccountDetails({ + worker, + summary, + withdrawalAccounts, + canUseFinanceActions, + onCopyInviteCode, + onAddWithdrawalAccount, +}: { + worker: WorkerUser + summary: WorkerProfileSummary | undefined + withdrawalAccounts: WorkerWithdrawalAccount[] + canUseFinanceActions: boolean + onCopyInviteCode: () => void + onAddWithdrawalAccount: () => void +}) { + return ( + + + {worker.username} + {worker.displayName || '-'} + {worker.phone || '-'} + + + {formatWorkerStatus(worker.status)} + + + {worker.level?.name || '-'} + + + {worker.inviteCode || '-'} + {worker.inviteCode ? ( + + )} + + + {formatMoney(worker.level?.permissions.depositFreeAmount || 0)} + + + {worker.level?.permissions.maxActiveOrders || 0} 单 + + {worker.reviewNote || '-'} + {formatDateTime(worker.createdAt)} + + {formatDateTime(worker.updatedAt)} + + + + ) +} diff --git a/apps/frontend/src/pages/worker/WorkerProfileFinanceModals.tsx b/apps/frontend/src/pages/worker/WorkerProfileFinanceModals.tsx new file mode 100644 index 00000000..00f940f1 --- /dev/null +++ b/apps/frontend/src/pages/worker/WorkerProfileFinanceModals.tsx @@ -0,0 +1,393 @@ +import { + Alert, + DatePicker, + Descriptions, + Form, + Image, + Input, + InputNumber, + Modal, + Select, + Space, + Typography, +} from 'antd' +import type { FormInstance } from 'antd' + +import ImageUpload from '@/components/files/ImageUpload' +import type { + UploadedFile, + WorkerFinanceConfig, + WorkerProfileSummary, + WorkerUser, + WorkerWithdrawalAccount, +} from '@/types/worker-platform' + +import { + formatMoney, + formatWithdrawChannel, + hasRechargeConfig, + resolveAvailableForWithdraw, +} from './worker-profile-view-utils' + +type RechargeFormValues = { + amount?: number + note?: string + paidAt?: string + proofFiles?: UploadedFile[] +} + +type WithdrawFormValues = { + amount?: number + accountChannel?: string + note?: string +} + +type WithdrawalAccountFormValues = { + accountChannel?: string + accountName?: string + accountNo?: string + alipayQrCodeImages?: UploadedFile[] + wechatQrCodeImages?: UploadedFile[] +} + +type AlipayQrCodeFormValues = { + alipayQrCodeImages?: UploadedFile[] +} + +export function WorkerProfileFinanceModals({ + isMobile, + worker, + summary, + financeConfig, + withdrawalAccounts, + selectedWithdrawalAccount, + selectedWithdrawChannel, + selectedWithdrawalAccountChannel, + rechargeOpen, + setRechargeOpen, + submittingRecharge, + rechargeForm, + submitRecharge, + withdrawalAccountOpen, + setWithdrawalAccountOpen, + submittingWithdrawalAccount, + withdrawalAccountForm, + submitWithdrawalAccount, + alipayQrCodeOpen, + setAlipayQrCodeOpen, + alipayQrCodeForm, + submitAlipayQrCode, + withdrawOpen, + setWithdrawOpen, + submittingWithdraw, + withdrawForm, + submitWithdraw, +}: { + isMobile: boolean + worker: WorkerUser | undefined + summary: WorkerProfileSummary | undefined + financeConfig: WorkerFinanceConfig | undefined + withdrawalAccounts: WorkerWithdrawalAccount[] + selectedWithdrawalAccount: WorkerWithdrawalAccount | undefined + selectedWithdrawChannel: string | undefined + selectedWithdrawalAccountChannel: string | undefined + rechargeOpen: boolean + setRechargeOpen: (open: boolean) => void + submittingRecharge: boolean + rechargeForm: FormInstance + submitRecharge: (values: RechargeFormValues) => Promise + withdrawalAccountOpen: boolean + setWithdrawalAccountOpen: (open: boolean) => void + submittingWithdrawalAccount: boolean + withdrawalAccountForm: FormInstance + submitWithdrawalAccount: (values: WithdrawalAccountFormValues) => Promise + alipayQrCodeOpen: boolean + setAlipayQrCodeOpen: (open: boolean) => void + alipayQrCodeForm: FormInstance + submitAlipayQrCode: (values: AlipayQrCodeFormValues) => Promise + withdrawOpen: boolean + setWithdrawOpen: (open: boolean) => void + submittingWithdraw: boolean + withdrawForm: FormInstance + submitWithdraw: (values: WithdrawFormValues) => Promise +}) { + return ( + <> + { + setRechargeOpen(false) + rechargeForm.resetFields() + }} + onOk={() => rechargeForm.submit()} + > +
+ + + {financeConfig?.recharge.qrCodeImage ? ( + + ) : null} + + + {financeConfig?.recharge.channelName || '-'} + + + {financeConfig?.recharge.accountName || '-'} + + + {financeConfig?.recharge.accountNo ? ( + {financeConfig.recharge.accountNo} + ) : ( + '-' + )} + + + {financeConfig?.recharge.instructions || '请转账后填写备注说明,方便管理员核对。'} + + + + + + + + + + + + + + + + +
+ + { + setWithdrawalAccountOpen(false) + withdrawalAccountForm.resetFields() + }} + onOk={() => withdrawalAccountForm.submit()} + > + +
+ + + + {selectedWithdrawalAccountChannel === 'wechat' ? ( + + + + ) : ( + <> + + + + + + + + )} +
+
+ + { + setAlipayQrCodeOpen(false) + alipayQrCodeForm.resetFields() + }} + onOk={() => alipayQrCodeForm.submit()} + > + +
+ + + +
+
+ + { + setWithdrawOpen(false) + withdrawForm.resetFields() + }} + onOk={() => withdrawForm.submit()} + > +
+ {financeConfig?.withdraw.instructions ? ( + + ) : null} + + + + {formatWithdrawChannel(selectedWithdrawalAccount?.accountChannel || '')} ·{' '} + {selectedWithdrawalAccount?.accountName || '-'} ·{' '} + {selectedWithdrawalAccount?.accountChannel === 'wechat' + ? '收款二维码' + : selectedWithdrawalAccount?.accountNoMasked || '-'} + + + + + {formatMoney(resolveAvailableForWithdraw(worker, summary))} + + + + { - setLedgerType(nextType) - setLedgerPage(1) - }} - /> - - - -
- {ledgersQuery.isLoading ? ( -
- -
- ) : (ledgersQuery.data?.data.items || []).length === 0 ? ( - - ) : ( - (ledgersQuery.data?.data.items || []).map((row) => ( -
-
- - {formatLedgerType(row.ledgerType)} - - = 0 - ? 'worker-amount-positive' - : 'worker-amount-negative' - } - style={{ fontSize: 16 }} - > - {row.amount >= 0 ? '+' : ''} - {formatMoney(row.amount)} - -
-
- 变动后余额: {formatMoney(row.balanceAfter)} - 冻结押金: {formatMoney(row.frozenAfter)} -
- {row.note ? ( -
说明: {row.note}
- ) : null} - {row.relatedPlatformOrderId ? ( -
- 订单号 {row.relatedPlatformOrderId} -
- ) : null} -
- {formatDateTime(String(row.createdAt || ''))} -
-
- )) - )} - - {(ledgersQuery.data?.data.pagination.total || 0) > 0 ? ( -
- { - setLedgerPage(nextPage) - setLedgerPageSize(nextPageSize) - }} - /> -
- ) : null} -
- - )} - - {activeTab === 'requests' && ( -
-
- - { - setRequestStatus(nextStatus) - setRequestPage(1) - }} - /> -
- -
- {requestsQuery.isLoading ? ( -
- -
- ) : (requestsQuery.data?.data.items || []).length === 0 ? ( - - ) : ( - (requestsQuery.data?.data.items || []).map((row) => ( -
-
- - - {formatRequestType(row.requestType)} - - - {formatRequestStatus(row.status)} - - - {formatMoney(row.amount)} -
- {row.requestType === 'withdraw' ? ( -
- 收款: {formatWithdrawChannel(row.accountChannel)} /{' '} - {row.accountName || '-'} ({maskAccountNo(row.accountNo)}) -
- ) : ( -
- {renderRechargeRequestSummary(row)} -
- )} - {row.note ? ( -
备注: {row.note}
- ) : null} - {row.reviewedNote ? ( -
- 审核备注: {row.reviewedNote} -
- ) : null} -
- {formatDateTime(String(row.createdAt || ''))} -
-
- )) - )} - - {(requestsQuery.data?.data.pagination.total || 0) > 0 ? ( -
- { - setRequestPage(nextPage) - setRequestPageSize(nextPageSize) - }} - /> -
- ) : null} -
-
- )} - - {activeTab === 'account' && ( -
-
-
- 账号 - {worker.username} -
-
- 昵称 - - {worker.displayName || '-'} - -
-
- 手机号 - - {worker.phone || '-'} - -
-
- 账号状态 - - - {formatWorkerStatus(worker.status)} - - -
-
- 当前等级 - - {worker.level?.name || '-'} - -
-
- 免押额度 - - {formatMoney(worker.level?.permissions.depositFreeAmount || 0)} - -
-
- 最大同时接单 - - {worker.level?.permissions.maxActiveOrders || 0} 单 - -
-
- 邀请人 - - {worker.inviter - ? worker.inviter.displayName || worker.inviter.username - : '-'} - -
-
- 已完成订单 - - {summary?.acceptedOrderCount || 0} 单 - -
-
- 累计充值 - - {formatMoney(worker.wallet.totalCreditedAmount)} - -
-
- 注册时间 - - {formatDateTime(worker.createdAt)} - -
-
-
- )} - - - - ) : null} - + !worker && !profileQuery.isLoading ? ( +
+ +
+ ) : worker ? ( + { + setLedgerType(nextType) + setLedgerPage(1) + }} + onReload={() => { + void ledgersQuery.refetch() + }} + page={ledgerPage} + pageSize={ledgerPageSize} + onPageChange={(nextPage, nextPageSize) => { + setLedgerPage(nextPage) + setLedgerPageSize(nextPageSize) + }} + /> + } + requestRecords={ + { + setRequestType(nextType) + setRequestPage(1) + }} + onRequestStatusChange={(nextStatus) => { + setRequestStatus(nextStatus) + setRequestPage(1) + }} + onReload={() => { + void requestsQuery.refetch() + }} + page={requestPage} + pageSize={requestPageSize} + onPageChange={(nextPage, nextPageSize) => { + setRequestPage(nextPage) + setRequestPageSize(nextPageSize) + }} + /> + } + onActiveTabChange={setActiveTab} + onRefresh={() => { + void refreshAll() + }} + onCopyInviteCode={copyInviteCode} + onRecharge={openRechargeModal} + onWithdraw={openWithdrawModal} + onChangePassword={() => setPasswordOpen(true)} + onManageDevices={() => setDevicesOpen(true)} + onContact={() => setContactOpen(true)} + onAddAlipayQrCode={openAlipayQrCodeModal} + onLogout={submitLogout} + /> + ) : null ) : (
@@ -1090,151 +473,30 @@ export default function WorkerProfilePage() { /> ) : null} - - - {resolveWorkerInitial(worker)} - - - {worker.displayName || worker.username} - - 账号:{worker.username} - - 手机号:{worker.phone || '-'} - - - - - {formatWorkerStatus(worker.status)} - - - {worker.workerType === 'internal' ? '内部打手' : '外部打手'} - - {worker.level?.name || '未分级'} - - - - - 我的邀请码: - {worker.inviteCode || '-'} - - - {levelProgress && levelProgress.nextThreshold !== null ? ( - - - 已累计完成 {summary?.acceptedOrderCount || 0} 单, 距下一等级还需{' '} - {Math.max( - 0, - levelProgress.nextThreshold - (summary?.acceptedOrderCount || 0), - )}{' '} - 单 - - `${percent}%`} - /> - - ) : ( - - 已累计完成 {summary?.acceptedOrderCount || 0} 单,当前已是最高等级 - - )} - - + - -
-
- 可用余额 - - {formatMoney(worker.wallet.availableAmount)} - - 可用于抢单冻结或提现申请 -
-
- 冻结押金 - - {formatMoney(worker.wallet.frozenDepositAmount)} - - - 抢单后冻结,验收后进入待解冻 - -
-
- 待解冻押金 - - {formatMoney(worker.wallet.pendingUnfreezeAmount)} - - 验收后按配置天数解冻到账 -
-
- 累计结算 - - {formatMoney(worker.wallet.totalSettledAmount)} - - 已结算入账的报酬合计 -
-
-
+ - - - - - {withdrawalAccounts.length < 2 ? ( - - ) : null} - {alipayWithdrawalAccount && !alipayWithdrawalAccount.alipayQrCodeImage ? ( - - ) : null} - - - - - - + setPasswordOpen(true)} + onManageDevices={() => setDevicesOpen(true)} + onContact={() => setContactOpen(true)} + onLogout={submitLogout} + /> - - {worker.username} - - {worker.displayName || '-'} - - - {worker.phone || '-'} - - - - {formatWorkerStatus(worker.status)} - - - - {worker.level?.name || '-'} - - - - {worker.inviteCode || '-'} - {worker.inviteCode ? ( - - )} - - - {formatMoney(worker.level?.permissions.depositFreeAmount || 0)} - - - {worker.level?.permissions.maxActiveOrders || 0} 单 - - - {worker.reviewNote || '-'} - - - {formatDateTime(worker.createdAt)} - - - {formatDateTime(worker.updatedAt)} - - - + ), }, { key: 'ledger', label: '资金流水', children: ( - - { - setRequestType(nextType) - setRequestPage(1) - }} - /> - account.accountChannel === 'alipay') - ? [{ value: 'alipay', label: '支付宝' }] - : []), - ...(!withdrawalAccounts.some((account) => account.accountChannel === 'wechat') - ? [{ value: 'wechat', label: '微信收款(仅支持 100 元及以下提现)' }] - : []), - ]} - /> - - - - - {selectedWithdrawalAccountChannel === 'wechat' ? ( - - - - ) : ( - <> - - - - - - - - )} - - - - { - setAlipayQrCodeOpen(false) - alipayQrCodeForm.resetFields() - }} - onOk={() => alipayQrCodeForm.submit()} - > - -
- - - -
-
- - { - setWithdrawOpen(false) - withdrawForm.resetFields() - }} - onOk={() => withdrawForm.submit()} - > -
- {financeConfig?.withdraw.instructions ? ( - - ) : null} - - - - {formatWithdrawChannel(selectedWithdrawalAccount?.accountChannel || '')} ·{' '} - {selectedWithdrawalAccount?.accountName || '-'} ·{' '} - {selectedWithdrawalAccount?.accountChannel === 'wechat' - ? '收款二维码' - : selectedWithdrawalAccount?.accountNoMasked || '-'} - - - - - {formatMoney(resolveAvailableForWithdraw(worker, summary))} - - - - + +
+
+ {loading ? ( +
+ +
+ ) : items.length === 0 ? ( + + ) : ( + items.map((row) => ( +
+
+ + {formatLedgerType(row.ledgerType)} + + = 0 ? 'worker-amount-positive' : 'worker-amount-negative'} + style={{ fontSize: 16 }} + > + {row.amount >= 0 ? '+' : ''} + {formatMoney(row.amount)} + +
+
+ 变动后余额: {formatMoney(row.balanceAfter)} + 冻结押金: {formatMoney(row.frozenAfter)} +
+ {row.note ?
说明: {row.note}
: null} + {row.relatedPlatformOrderId ? ( +
订单号 {row.relatedPlatformOrderId}
+ ) : null} +
+ {formatDateTime(String(row.createdAt || ''))} +
+
+ )) + )} + {(pagination?.total || 0) > 0 ? ( +
+ +
+ ) : null} +
+ + ) +} + +export function WorkerProfileMobileRequestRecords({ + data, + loading, + refreshing, + requestType, + requestStatus, + onRequestTypeChange, + onRequestStatusChange, + onReload, + page, + pageSize, + onPageChange, +}: RequestRecordsProps) { + const items = data?.data.items || [] + const pagination = data?.data.pagination + return ( +
+
+ + +
+
+ {loading ? ( +
+ +
+ ) : items.length === 0 ? ( + + ) : ( + items.map((row) => ( +
+
+ + + {formatRequestType(row.requestType)} + + + {formatRequestStatus(row.status)} + + + {formatMoney(row.amount)} +
+ {row.requestType === 'withdraw' ? ( +
+ 收款: {formatWithdrawChannel(row.accountChannel)} / {row.accountName || '-'} ( + {maskAccountNo(row.accountNo)}) +
+ ) : ( +
+ {renderRechargeRequestSummary(row)} +
+ )} + {row.note ?
备注: {row.note}
: null} + {row.reviewedNote ? ( +
+ 审核备注: {row.reviewedNote} +
+ ) : null} +
+ {formatDateTime(String(row.createdAt || ''))} +
+
+ )) + )} + {(pagination?.total || 0) > 0 ? ( +
+ +
+ ) : null} +
+
+ ) +} + +export function WorkerProfileDesktopLedgerRecords({ + data, + error, + loading, + refreshing, + ledgerType, + onLedgerTypeChange, + onReload, + page, + pageSize, + onPageChange, +}: LedgerRecordsProps) { + const pagination = data?.data.pagination + return ( + + +