import { CheckOutlined, FormOutlined, PlusOutlined, ReloadOutlined, SendOutlined, SyncOutlined, TeamOutlined, WarningOutlined, } from '@ant-design/icons' import { useQuery, useQueryClient } from '@tanstack/react-query' import { App, Button, Card, Descriptions, Drawer, Form, Input, InputNumber, Modal, Select, Space, Statistic, Switch, Table, Tabs, Tag, Typography, } from 'antd' import type { TableColumnsType } from 'antd' import { useEffect, useState } from 'react' import { useNavigate } from 'react-router' import JsonPreview from '@/components/admin/JsonPreview' import ImageUpload from '@/components/files/ImageUpload' import ImagePreviewList from '@/components/files/ImagePreviewList' import PageHeader from '@/components/admin/PageHeader' import { acceptAdminWorkOrder, createAdminMockWorkOrder, creditAdminWorkerWallet, deleteAdminWorkCategory, deleteAdminWorkerLevel, fetchAdminWorkerFinanceConfig, fetchAdminWorkerFinanceRequests, fetchAdminWorkCategories, fetchAdminWorkOrderSharing, fetchAdminWorkProductRules, fetchAdminWorkerLevels, fetchAdminWorkerPlatformSummary, fetchAdminWorkerUsers, fetchAdminWorkOrders, markAdminWorkOrderProblem, publishAdminWorkOrder, reviewAdminWorkerFinanceRequest, resolveAdminProblemWorkOrder, reviewAdminWorkerUser, saveAdminWorkerFinanceConfig, saveAdminWorkCategory, saveAdminWorkProductRule, saveAdminWorkerLevel, submitAdminWorkOrderMaterial, syncAdminWorkerOrdersFromSource, unpublishAdminWorkOrder, updateAdminWorkOrderSharing, } from '@/services/admin' import type { CollectField, UploadedFile, WorkCategory, WorkOrder, WorkOrderShare, WorkProductRule, WorkerFinanceConfig, WorkerFinanceRequest, WorkerLevel, WorkerUser, } from '@/types/worker-platform' import { ADMIN_DEFAULT_PAGE_SIZE, buildAdminTablePagination, } from '@/utils/admin-pagination' import { formatAdminDateTime } from '@/utils/admin-time' import { formatMoney } from './shared' export default function LevelsPanel() { const { message } = App.useApp() const queryClient = useQueryClient() const levelsQuery = useQuery({ queryKey: ['admin-worker-platform-levels'], queryFn: () => fetchAdminWorkerLevels(), }) const [form] = Form.useForm() const [editingLevel, setEditingLevel] = useState(null) const [deletingLevel, setDeletingLevel] = useState(null) async function refreshLevels() { await levelsQuery.refetch() } function startEdit(level: WorkerLevel) { setEditingLevel(level) form.setFieldsValue({ levelKey: level.levelKey, name: level.name, depositFreeAmount: level.depositFreeAmount, maxActiveOrders: level.maxActiveOrders, upgradeThreshold: level.upgradeThreshold, visibleDelaySeconds: level.visibleDelaySeconds, }) } function cancelEdit() { setEditingLevel(null) form.resetFields() } async function saveLevel(values: { levelKey: string name: string depositFreeAmount?: number maxActiveOrders?: number upgradeThreshold?: number visibleDelaySeconds?: number }) { try { await saveAdminWorkerLevel(values) message.success(editingLevel ? '等级已更新' : '等级已保存') cancelEdit() await refreshLevels() } catch (error) { message.error(error instanceof Error ? error.message : '保存失败') } } async function toggleLevel(level: WorkerLevel) { try { await saveAdminWorkerLevel({ levelKey: level.levelKey, name: level.name, depositFreeAmount: level.depositFreeAmount, maxActiveOrders: level.maxActiveOrders, upgradeThreshold: level.upgradeThreshold, visibleDelaySeconds: level.visibleDelaySeconds, status: level.status === 'active' ? 'disabled' : 'active', }) message.success(level.status === 'active' ? '等级已停用' : '等级已启用') await refreshLevels() } catch (error) { message.error(error instanceof Error ? error.message : '操作失败') } } async function submitDelete() { if (!deletingLevel) return try { await deleteAdminWorkerLevel(deletingLevel.levelId) message.success('等级已删除') setDeletingLevel(null) await refreshLevels() await queryClient.invalidateQueries({ queryKey: ['admin-worker-platform-workers'], }) } catch (error) { message.error(error instanceof Error ? error.message : '删除失败') setDeletingLevel(null) } } const columns: TableColumnsType = [ { title: '等级', dataIndex: 'name' }, { title: '标识', dataIndex: 'levelKey' }, { title: '免押额度', render: (_, row) => formatMoney(row.depositFreeAmount), }, { title: '最大同时接单', dataIndex: 'maxActiveOrders' }, { title: '升级所需累计完成', dataIndex: 'upgradeThreshold' }, { title: '可见延迟', width: 110, render: (_, row) => row.visibleDelaySeconds > 0 ? `${row.visibleDelaySeconds} 秒` : '立即', }, { title: '状态', width: 110, render: (_, row) => ( {row.status === 'active' ? '启用' : '停用'} ), }, { title: '操作', width: 240, render: (_, row) => ( ), }, ] return (
{editingLevel ? : null}
rowKey="levelId" loading={levelsQuery.isLoading} dataSource={levelsQuery.data?.data.items || []} columns={columns} pagination={false} /> setDeletingLevel(null)} okButtonProps={{ danger: true }} okText="删除" cancelText="取消" > 确定删除等级「{deletingLevel?.name}」?正在使用该等级的打手将无法删除,需先调整。
) }