接单工单状态筛选支持多选

- 前端:状态筛选改为多选(Select mode=multiple),可一次筛选多个状态
- 后端:listWorkOrders 支持 statuses 数组查询(ANY 匹配),兼容旧单状态参数
- 批量验收入口仅在单独筛选待验收时显示,避免多选误操作
This commit is contained in:
yml2213
2026-08-16 15:48:15 +08:00
parent 31f134579c
commit 737f9ddcbe
6 changed files with 83 additions and 31 deletions
@@ -141,7 +141,7 @@ export default function WorkOrdersPanel() {
const navigate = useNavigate()
const queryClient = useQueryClient()
const canEditRequirementFields = hasAdminRole('operator')
const [status, setStatus] = useState('')
const [statuses, setStatuses] = useState<string[]>([])
const [keyword, setKeyword] = useState('')
const [keywordInput, setKeywordInput] = useState('')
const [workerId, setWorkerId] = useState<number | undefined>()
@@ -181,10 +181,27 @@ export default function WorkOrdersPanel() {
unitReward?: number
totalAmount?: number
}>()
// 仅单独筛选「待验收」时提供批量验收入口(多选状态下不启用勾选,避免误操作)
const isPendingAcceptanceOnly =
statuses.length === 1 && statuses[0] === 'pending_acceptance'
const ordersQuery = useQuery({
queryKey: ['admin-worker-platform-orders', status, keyword, workerId, page, pageSize],
queryFn: () => fetchAdminWorkOrders({ status, keyword, workerId, page, pageSize }),
queryKey: [
'admin-worker-platform-orders',
statuses.join(','),
keyword,
workerId,
page,
pageSize,
],
queryFn: () =>
fetchAdminWorkOrders({
status: statuses.length > 0 ? statuses.join(',') : undefined,
keyword,
workerId,
page,
pageSize,
}),
})
const ordersPagination = ordersQuery.data?.data.pagination
const categoriesQuery = useQuery({
@@ -208,7 +225,7 @@ export default function WorkOrdersPanel() {
useEffect(() => {
setSelectedAcceptanceOrderIds([])
}, [status, keyword, workerId, page, pageSize])
}, [statuses, keyword, workerId, page, pageSize])
function openAssignModal(row: WorkOrder) {
setAssignOrder(row)
@@ -441,7 +458,7 @@ export default function WorkOrdersPanel() {
function clearOrderFilters() {
setKeywordInput('')
setKeyword('')
setStatus('')
setStatuses([])
setWorkerId(undefined)
setPage(1)
}
@@ -854,17 +871,18 @@ export default function WorkOrdersPanel() {
onPressEnter={searchOrders}
/>
<Select
value={status}
style={{ width: 150 }}
options={[
{ value: '', label: '全部状态' },
...FILTERABLE_WORK_ORDER_STATUSES.map((item) => ({
value: item,
label: <Tag color={resolveStatusColor(item)}>{formatStatus(item)}</Tag>,
})),
]}
onChange={(nextStatus) => {
setStatus(nextStatus)
mode="multiple"
allowClear
value={statuses}
placeholder="全部状态(可多选)"
style={{ minWidth: 220, maxWidth: 420 }}
maxTagCount="responsive"
options={FILTERABLE_WORK_ORDER_STATUSES.map((item) => ({
value: item,
label: <Tag color={resolveStatusColor(item)}>{formatStatus(item)}</Tag>,
}))}
onChange={(nextStatuses: string[]) => {
setStatuses(nextStatuses)
setPage(1)
}}
/>
@@ -903,7 +921,7 @@ export default function WorkOrdersPanel() {
title="接单工单"
extra={
<Space>
{status === 'pending_acceptance' ? (
{isPendingAcceptanceOnly ? (
<Button
type="primary"
icon={<CheckOutlined />}
@@ -930,7 +948,7 @@ export default function WorkOrdersPanel() {
dataSource={ordersQuery.data?.data.items || []}
columns={columns}
rowSelection={
status === 'pending_acceptance'
isPendingAcceptanceOnly
? {
selectedRowKeys: selectedAcceptanceOrderIds,
onChange: (selectedRowKeys) =>