diff --git a/apps/frontend/src/pages/admin/panels/AfterSalesPanel.tsx b/apps/frontend/src/pages/admin/panels/AfterSalesPanel.tsx index db7e1626..dcf5382a 100644 --- a/apps/frontend/src/pages/admin/panels/AfterSalesPanel.tsx +++ b/apps/frontend/src/pages/admin/panels/AfterSalesPanel.tsx @@ -33,6 +33,7 @@ import type { WorkOrder, } from '@/types/worker-platform' import { ADMIN_DEFAULT_PAGE_SIZE, buildAdminTablePagination } from '@/utils/admin-pagination' +import { normalizeSearchText } from '@/utils/admin-realtime-work-orders' import { formatAdminDateTime } from '@/utils/admin-time' import { uniqueUploadedFiles } from '@/utils/image-identity' import { asRecord, formatMoney } from './shared' @@ -54,6 +55,14 @@ type AfterSalesRepayFormValues = { note?: string } +/** 售后单状态筛选(与列表标签同一套文案)。 */ +const AFTER_SALES_STATUS_OPTIONS = [ + { value: 'awaiting_worker_response', label: '待打手说明' }, + { value: 'under_review', label: '客服处理中' }, + { value: 'recovery_pending', label: '追缴中' }, + { value: 'closed', label: '已关闭' }, +] + export type AfterSalesPanelHandle = { openCreateModal: (row: WorkOrder) => void } @@ -67,6 +76,10 @@ const AfterSalesPanel = forwardRef(function AfterSalesPan const [afterSalesFiles, setAfterSalesFiles] = useState([]) const [afterSalesPage, setAfterSalesPage] = useState(1) const [afterSalesPageSize, setAfterSalesPageSize] = useState(ADMIN_DEFAULT_PAGE_SIZE) + /** 搜索框输入值;点搜索/回车后才写入 afterSalesKeyword,避免每敲一个字就请求。 */ + const [afterSalesKeywordInput, setAfterSalesKeywordInput] = useState('') + const [afterSalesKeyword, setAfterSalesKeyword] = useState('') + const [afterSalesStatus, setAfterSalesStatus] = useState('') const [afterSalesCreateForm] = Form.useForm() const [afterSalesResolutionForm] = Form.useForm() const [afterSalesRepayForm] = Form.useForm() @@ -77,9 +90,20 @@ const AfterSalesPanel = forwardRef(function AfterSalesPan enabled: Boolean(afterSalesOrder?.sharing?.enabled), }) const afterSalesCasesQuery = useQuery({ - queryKey: ['admin-worker-platform-after-sales-cases', afterSalesPage, afterSalesPageSize], + queryKey: [ + 'admin-worker-platform-after-sales-cases', + afterSalesPage, + afterSalesPageSize, + afterSalesKeyword, + afterSalesStatus, + ], queryFn: () => - fetchAdminAfterSalesCases({ page: afterSalesPage, pageSize: afterSalesPageSize }), + fetchAdminAfterSalesCases({ + page: afterSalesPage, + pageSize: afterSalesPageSize, + ...(afterSalesKeyword ? { keyword: afterSalesKeyword } : {}), + ...(afterSalesStatus ? { status: afterSalesStatus } : {}), + }), }) useImperativeHandle(ref, () => ({ @@ -200,6 +224,41 @@ const AfterSalesPanel = forwardRef(function AfterSalesPan } bordered={false} > +
+ + { + const nextValue = event.target.value + setAfterSalesKeywordInput(nextValue) + // 清空输入立即恢复全量,不用再点一次搜索。 + if (!nextValue.trim()) { + setAfterSalesKeyword('') + setAfterSalesPage(1) + } + }} + onSearch={(value) => { + // 归一化(全角→半角、去零宽字符):粘贴来的单号常夹带不可见字符。 + setAfterSalesKeyword(normalizeSearchText(value)) + setAfterSalesPage(1) + }} + /> +