import { ReloadOutlined } from '@ant-design/icons' import { useQuery, useQueryClient } from '@tanstack/react-query' import { App, Button, Card, Form, Input, Modal, Space, Table, Tag, Typography } from 'antd' import type { TableColumnsType } from 'antd' import { useEffect, useState } from 'react' import { useSearchParams } from 'react-router' import { fetchAdminWorkerOrderFeedbacks, resolveAdminWorkerOrderFeedback } from '@/services/admin' import type { WorkerOrderFeedback } from '@/types/worker-platform' import { formatAdminDateTime } from '@/utils/admin-time' type FeedbackReplyFormValues = { reply?: string } export default function FeedbacksPanel() { const { message } = App.useApp() const queryClient = useQueryClient() const [searchParams, setSearchParams] = useSearchParams() const [target, setTarget] = useState(null) const [form] = Form.useForm() const feedbacksQuery = useQuery({ queryKey: ['admin-worker-order-feedbacks', 'pending'], queryFn: () => fetchAdminWorkerOrderFeedbacks('pending'), }) useEffect(() => { const feedbackId = Number(searchParams.get('feedbackId') || 0) if (!Number.isInteger(feedbackId) || feedbackId <= 0) return const feedback = (feedbacksQuery.data?.data.items || []).find( (item) => item.feedbackId === feedbackId, ) if (!feedback) return setTarget(feedback) form.resetFields() setSearchParams( (current) => { current.delete('feedbackId') return current }, { replace: true }, ) }, [feedbacksQuery.data, form, searchParams, setSearchParams]) async function submitReply(values: FeedbackReplyFormValues) { if (!target) return try { await resolveAdminWorkerOrderFeedback(target.feedbackId, { reply: String(values.reply || '').trim(), }) message.success('问题反馈已处理') setTarget(null) form.resetFields() await Promise.all([ queryClient.invalidateQueries({ queryKey: ['admin-worker-order-feedbacks'] }), queryClient.invalidateQueries({ queryKey: ['admin-worker-platform-orders'] }), ]) } catch (error) { message.error(error instanceof Error ? error.message : '处理问题反馈失败') } } const columns: TableColumnsType = [ { title: '订单', width: 260, render: (_, feedback) => (
{feedback.productName || '-'} {feedback.workOrderNo || '-'} {feedback.shopName || '-'}
), }, { title: '打手', width: 180, render: (_, feedback) => ( {feedback.workerName || `打手 #${feedback.workerId}`} {feedback.shareQuantity ? ( 拼单 {feedback.shareQuantity} 份 ) : null} ), }, { title: '反馈内容', render: (_, feedback) => ( {feedback.content} ), }, { title: '反馈时间', width: 180, render: (_, feedback) => formatAdminDateTime(feedback.createdAt), }, { title: '操作', width: 120, render: (_, feedback) => ( ), }, ] return ( <> } loading={feedbacksQuery.isFetching} onClick={() => feedbacksQuery.refetch()} > 刷新 } bordered={false} > rowKey="feedbackId" size="small" loading={feedbacksQuery.isLoading} dataSource={feedbacksQuery.data?.data.items || []} columns={columns} pagination={false} locale={{ emptyText: '暂无待处理问题反馈' }} scroll={{ x: 900 }} /> { setTarget(null) form.resetFields() }} onOk={() => form.submit()} okText="完成处理" destroyOnHidden > {target ? ( {target.workerName || `打手 #${target.workerId}`}:{target.content} 完成处理不会更改订单状态、验收或资金,仅向打手记录处理回复。
) : null}
) }