import { useQuery, useQueryClient } from '@tanstack/react-query' import { App, Button, Card, Form, Input, InputNumber, Modal, Space, Switch, Table, Tag, Typography, } from 'antd' import type { TableColumnsType } from 'antd' import { useState } from 'react' import { deleteAdminWorkerLevel, fetchAdminWorkerLevels, saveAdminWorkerLevel, } from '@/services/admin' import type { WorkerLevel } from '@/types/worker-platform' 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, autoAcceptWithoutEvidence: level.autoAcceptWithoutEvidence, visibleDelaySeconds: level.visibleDelaySeconds, }) } function cancelEdit() { setEditingLevel(null) form.resetFields() } async function saveLevel(values: { levelKey: string name: string depositFreeAmount?: number maxActiveOrders?: number upgradeThreshold?: number autoAcceptWithoutEvidence?: boolean 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, autoAcceptWithoutEvidence: level.autoAcceptWithoutEvidence, 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: 130, render: (_, row) => row.autoAcceptWithoutEvidence ? 开启 : 关闭, }, { 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}」?正在使用该等级的打手将无法删除,需先调整。
) }