+
{formatMoney(order.rewardAmount)}
-
- 所需保证金:{formatMoney(order.freezeDepositAmount)}
- 发布时间:{formatDateTime(resolvePublishedTime(order))}
-
+
+ 所需保证金:{formatMoney(order.freezeDepositAmount)}
+
-
-
- 资料要求
- {formatRequirementPreview(requirementFields)}
-
-
- 抢单判断
-
- {disabledReason || buildGrabReadyHint(order)}
-
-
-
+ {disabledReason ? (
+
+ {disabledReason}
+
+ ) : null}
} onClick={() => setDetailOrder(order)}>
@@ -517,24 +485,6 @@ function formatRequirementShortLabel(fields: CollectField[]) {
return `${requiredCount} 项必填 / 共 ${fields.length} 项`
}
-function formatRequirementPreview(fields: CollectField[]) {
- if (fields.length === 0) {
- return '当前工单未配置额外资料字段'
- }
-
- const preview = fields
- .slice(0, 3)
- .map((field) => field.label)
- .filter(Boolean)
- .join('、')
-
- if (fields.length <= 3) {
- return preview
- }
-
- return `${preview} 等 ${fields.length} 项`
-}
-
function resolvePublishedTime(order: WorkOrder) {
return order.publishedAt || order.createdAt || order.updatedAt
}
diff --git a/apps/frontend/src/pages/worker/WorkerOrdersPage.tsx b/apps/frontend/src/pages/worker/WorkerOrdersPage.tsx
index 2e3cebc1..425a76ff 100644
--- a/apps/frontend/src/pages/worker/WorkerOrdersPage.tsx
+++ b/apps/frontend/src/pages/worker/WorkerOrdersPage.tsx
@@ -9,13 +9,17 @@ import {
App,
Button,
Card,
+ Col,
Descriptions,
Drawer,
Empty,
Form,
Input,
Modal,
+ Row,
+ Segmented,
Space,
+ Statistic,
Table,
Tag,
Typography,
@@ -38,37 +42,13 @@ const STATUS_OPTIONS = [
{ value: 'cancelled', label: '已取消' },
] as const
-const STATUS_OVERVIEW = [
- {
- key: 'in_progress',
- label: '代练中',
- note: '正在执行中的订单',
- tone: 'blue',
- },
- {
- key: 'pending_acceptance',
- label: '待验收',
- note: '已经提交,等待审核',
- tone: 'gold',
- },
- {
- key: 'problem',
- label: '问题单',
- note: '需要补充或重新处理',
- tone: 'red',
- },
- {
- key: 'accepted',
- label: '已验收',
- note: '已完成并结算的订单',
- tone: 'green',
- },
- {
- key: 'cancelled',
- label: '已取消',
- note: '已结束且不再继续',
- tone: 'slate',
- },
+const STATUS_SUMMARY_ITEMS = [
+ { key: 'all', label: '全部订单', note: '当前账号历史接单总数' },
+ { key: 'in_progress', label: '代练中', note: '正在执行中的订单' },
+ { key: 'pending_acceptance', label: '待验收', note: '已提交,等待审核' },
+ { key: 'problem', label: '问题单', note: '需要补充或重新处理' },
+ { key: 'accepted', label: '已验收', note: '已完成并结算的订单' },
+ { key: 'cancelled', label: '已取消', note: '已结束且不再继续' },
] as const
type AcceptanceFormValues = {
@@ -248,7 +228,11 @@ export default function WorkerOrdersPage() {
详情
{canSubmitAcceptance(row) ? (
- } type="primary" onClick={() => openAcceptanceModal(row)}>
+ }
+ type="primary"
+ onClick={() => openAcceptanceModal(row)}
+ >
提交验收
) : null}
@@ -270,119 +254,114 @@ export default function WorkerOrdersPage() {
-
-
- 全部订单
-
- {Number(overviewQuery.data?.all || 0)}
-
- 当前账号历史接单总数
-
- {STATUS_OVERVIEW.map((item) => (
-
- {item.label}
-
- {Number(overviewQuery.data?.[item.key] || 0)}
-
- {item.note}
-
+
+ {STATUS_SUMMARY_ITEMS.map((item) => (
+
+
+
+ {item.note}
+
+
))}
-
+
-
-
-
- }
- onChange={(event) => {
- const nextValue = event.target.value
- setKeywordInput(nextValue)
- if (!nextValue.trim()) {
- setKeyword('')
- setPage(1)
+
+
+
+
+
+ }
+ onChange={(event) => {
+ const nextValue = event.target.value
+ setKeywordInput(nextValue)
+ if (!nextValue.trim()) {
+ setKeyword('')
+ setPage(1)
+ }
+ }}
+ onPressEnter={applyKeywordSearch}
+ />
+ }
+ loading={ordersQuery.isFetching}
+ onClick={applyKeywordSearch}
+ >
+ 搜索
+
+
+
+ 当前筛选:
+ {STATUS_OPTIONS.find((item) => item.value === status)?.label || '全部订单'}
+
+
+
+ {
+ const countKey = item.value || 'all'
+ return {
+ value: item.value || 'all',
+ label: `${item.label} (${Number(overviewQuery.data?.[countKey] || 0)})`,
}
+ })}
+ onChange={(value) => {
+ const nextStatus = String(value) === 'all' ? '' : String(value)
+ setStatus(nextStatus)
+ setPage(1)
}}
- onPressEnter={applyKeywordSearch}
/>
- }
- loading={ordersQuery.isFetching}
- onClick={applyKeywordSearch}
- >
- 搜索
-
-
-
- 当前筛选:{STATUS_OPTIONS.find((item) => item.value === status)?.label || '全部订单'}
-
-
+
-
- {STATUS_OPTIONS.map((item) => {
- const active = status === item.value
- const countKey = item.value || 'all'
- return (
-
- )
- })}
-
-
-
- rowKey="workOrderId"
- loading={ordersQuery.isLoading}
- dataSource={orders}
- columns={columns}
- locale={{
- emptyText: ordersQuery.error ? (
-
- ) : (
-
- ),
- }}
- pagination={{
- current: pagination?.page || page,
- pageSize: pagination?.pageSize || pageSize,
- total: pagination?.total || 0,
- showSizeChanger: true,
- pageSizeOptions: [10, 20, 50, 100],
- showTotal: (total) => `共 ${total} 条`,
- onChange: (nextPage, nextPageSize) => {
- setPage(nextPage)
- setPageSize(nextPageSize)
- },
- }}
- scroll={{ x: 1160 }}
- />
+
+ rowKey="workOrderId"
+ size="small"
+ loading={ordersQuery.isLoading}
+ dataSource={orders}
+ columns={columns}
+ locale={{
+ emptyText: ordersQuery.error ? (
+
+ ) : (
+
+ ),
+ }}
+ pagination={{
+ current: pagination?.page || page,
+ pageSize: pagination?.pageSize || pageSize,
+ total: pagination?.total || 0,
+ showSizeChanger: true,
+ pageSizeOptions: [10, 20, 50, 100],
+ showTotal: (total) => `共 ${total} 条`,
+ onChange: (nextPage, nextPageSize) => {
+ setPage(nextPage)
+ setPageSize(nextPageSize)
+ },
+ }}
+ scroll={{ x: 1160 }}
+ />
+
{canSubmitAcceptance(detailOrder) ? (
- } onClick={() => openAcceptanceModal(detailOrder)}>
+ }
+ onClick={() => openAcceptanceModal(detailOrder)}
+ >
提交验收
) : null}
diff --git a/apps/frontend/src/pages/worker/WorkerProfilePage.tsx b/apps/frontend/src/pages/worker/WorkerProfilePage.tsx
index bf03b907..d424bdcb 100644
--- a/apps/frontend/src/pages/worker/WorkerProfilePage.tsx
+++ b/apps/frontend/src/pages/worker/WorkerProfilePage.tsx
@@ -12,22 +12,27 @@ import { useQuery, useQueryClient } from '@tanstack/react-query'
import {
Alert,
App,
+ Avatar,
Button,
Card,
+ Col,
Descriptions,
Empty,
Form,
Input,
InputNumber,
Modal,
+ Row,
Select,
Space,
+ Statistic,
Table,
+ Tabs,
Tag,
Typography,
} from 'antd'
import type { TableColumnsType } from 'antd'
-import { useRef, useState, type ReactNode, type RefObject } from 'react'
+import { useState } from 'react'
import { useNavigate } from 'react-router'
import {
@@ -39,13 +44,14 @@ import {
fetchWorkerWalletLedgers,
logoutWorker,
} from '@/services/worker'
-import { clearWorkerSession } from '@/utils/worker-auth'
import type {
WorkerFinanceRequest,
WorkerProfileSummary,
WorkerUser,
WorkerWalletLedger,
} from '@/types/worker-platform'
+import { formatDateTime } from '@/utils/date-time'
+import { clearWorkerSession } from '@/utils/worker-auth'
type RechargeFormValues = {
amount?: number
@@ -66,13 +72,21 @@ type PasswordFormValues = {
confirmPassword?: string
}
+type MetricCardItem = {
+ label: string
+ value: number
+ note: string
+ prefix?: string
+ suffix?: string
+ precision?: number
+}
+
export default function WorkerProfilePage() {
const { message } = App.useApp()
const navigate = useNavigate()
const queryClient = useQueryClient()
- const ledgerSectionRef = useRef(null)
- const requestSectionRef = useRef(null)
+ const [activeTab, setActiveTab] = useState('account')
const [ledgerPage, setLedgerPage] = useState(1)
const [ledgerPageSize, setLedgerPageSize] = useState(10)
const [ledgerType, setLedgerType] = useState('')
@@ -152,21 +166,17 @@ export default function WorkerProfilePage() {
}
}
- function scrollToSection(ref: RefObject) {
- ref.current?.scrollIntoView({ behavior: 'smooth', block: 'start' })
- }
-
function jumpToLedgerSection(nextLedgerType = '') {
setLedgerType(nextLedgerType)
setLedgerPage(1)
- scrollToSection(ledgerSectionRef)
+ setActiveTab('ledger')
}
function jumpToRequestSection(nextRequestType = '', nextStatus = '') {
setRequestType(nextRequestType)
setRequestStatus(nextStatus)
setRequestPage(1)
- scrollToSection(requestSectionRef)
+ setActiveTab('requests')
}
async function submitRecharge(values: RechargeFormValues) {
@@ -232,7 +242,7 @@ export default function WorkerProfilePage() {
title: '时间',
dataIndex: 'createdAt',
width: 180,
- render: (value) => String(value || '-'),
+ render: (value) => formatDateTime(String(value || '')),
},
{
title: '类型',
@@ -287,7 +297,7 @@ export default function WorkerProfilePage() {
title: '申请时间',
dataIndex: 'createdAt',
width: 180,
- render: (value) => String(value || '-'),
+ render: (value) => formatDateTime(String(value || '')),
},
{
title: '类型',
@@ -385,7 +395,7 @@ export default function WorkerProfilePage() {
{!worker && !profileQuery.isLoading ? : null}
{worker ? (
- <>
+
{!canUseFinanceActions ? (
) : null}
-
-
-
-
- {String(worker.displayName || worker.username || '打')
- .trim()
- .slice(0, 1)
- .toUpperCase()}
-
-
-
-
- {worker.displayName || worker.username}
-
-
-
- {worker.level?.name || '未分级'}
-
-
- {formatWorkerStatus(worker.status)}
-
-
-
-
- 账号:{worker.username}
-
-
- 手机号:{worker.phone || '-'}
-
-
-
-
-
- 累计充值
-
- {formatMoney(worker.wallet.totalCreditedAmount)}
-
-
-
- 累计结算
-
- {formatMoney(worker.wallet.totalSettledAmount)}
-
-
-
-
-
-
- {buildMetricCards(worker, summary).map((item) => (
-
- {item.label}
- {item.value}
- {item.note}
-
- ))}
-
-
-
-
-
}
- title="充值申请"
- description="线下充值后提交金额与备注,等待管理员入账。"
- tone="blue"
- disabled={!canUseFinanceActions}
- onClick={() => setRechargeOpen(true)}
- />
-
}
- title="提现申请"
- description="填写收款账号并发起提现,系统会保留申请记录。"
- tone="green"
- disabled={!canUseFinanceActions}
- onClick={() => setWithdrawOpen(true)}
- />
-
}
- title="资金流水"
- description="查看充值、押金冻结、结算奖励等钱包变动明细。"
- tone="slate"
- onClick={() => jumpToLedgerSection()}
- />
-
}
- title="提现记录"
- description="快速查看提现申请状态、审核备注和收款信息。"
- tone="orange"
- onClick={() => jumpToRequestSection('withdraw')}
- />
-
}
- title="修改密码"
- description="更新接单账号密码,修改后会要求重新登录。"
- tone="violet"
- onClick={() => setPasswordOpen(true)}
- />
-
}
- title="联系管理员"
- description="查看处理说明和当前账号资料,沟通充值、提现或审核问题。"
- tone="amber"
- onClick={() => setContactOpen(true)}
- />
-
}
- title="退出登录"
- description="当前设备退出接单端登录,会清理本地登录态。"
- tone="rose"
- onClick={submitLogout}
- />
-
-
-
-
- {worker.username}
- {worker.displayName}
- {worker.phone || '-'}
-
+
+
+
+ {resolveWorkerInitial(worker)}
+
+
+
+ {worker.displayName || worker.username}
+
+
+ 账号:{worker.username}
+
+
+ 手机号:{worker.phone || '-'}
+
+
+
{formatWorkerStatus(worker.status)}
-
-
- {worker.level?.name || '-'}
-
-
- {formatMoney(worker.level?.permissions.depositFreeAmount || 0)}
-
-
- {worker.level?.permissions.maxActiveOrders || 0} 单
-
-
- {worker.reviewNote || '-'}
-
-
- {worker.createdAt || '-'}
-
-
- {worker.updatedAt || '-'}
-
-
+ {worker.level?.name || '未分级'}
+
+
-
-
-