feat:售后问题单新增一个搜索订单的功能,搜索key:售后单号,工单号,平台号,责任打手,同时加上状态筛选

This commit is contained in:
2026-10-26 10:25:36 +08:00
parent 3da4510ffc
commit b0ab8cd410
@@ -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<AfterSalesPanelHandle>(function AfterSalesPan
const [afterSalesFiles, setAfterSalesFiles] = useState<UploadedFile[]>([])
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<AfterSalesCreateFormValues>()
const [afterSalesResolutionForm] = Form.useForm<AfterSalesResolutionFormValues>()
const [afterSalesRepayForm] = Form.useForm<AfterSalesRepayFormValues>()
@@ -77,9 +90,20 @@ const AfterSalesPanel = forwardRef<AfterSalesPanelHandle>(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<AfterSalesPanelHandle>(function AfterSalesPan
}
bordered={false}
>
<div style={{ marginBottom: 16 }}>
<Space wrap>
<Input.Search
allowClear
value={afterSalesKeywordInput}
placeholder="售后单号 / 工单号 / 平台号 / 责任打手"
style={{ width: 340 }}
onChange={(event) => {
const nextValue = event.target.value
setAfterSalesKeywordInput(nextValue)
// 清空输入立即恢复全量,不用再点一次搜索。
if (!nextValue.trim()) {
setAfterSalesKeyword('')
setAfterSalesPage(1)
}
}}
onSearch={(value) => {
// 归一化(全角→半角、去零宽字符):粘贴来的单号常夹带不可见字符。
setAfterSalesKeyword(normalizeSearchText(value))
setAfterSalesPage(1)
}}
/>
<Select
allowClear
value={afterSalesStatus || undefined}
placeholder="全部状态"
style={{ width: 160 }}
options={AFTER_SALES_STATUS_OPTIONS}
onChange={(value) => {
setAfterSalesStatus(String(value || ''))
setAfterSalesPage(1)
}}
/>
</Space>
</div>
<Table<WorkerAfterSalesCase>
rowKey="caseId"
loading={afterSalesCasesQuery.isLoading}