打手列表新增VIP等级筛选

This commit is contained in:
yml2213
2026-08-23 16:21:39 +08:00
parent 3df271b30c
commit b49fa12484
4 changed files with 38 additions and 2 deletions
@@ -420,6 +420,8 @@ export type ListInput = {
workerType?: string workerType?: string
/** 后台打手列表按主键精确定位。 */ /** 后台打手列表按主键精确定位。 */
workerId?: number workerId?: number
/** 后台打手列表按 VIP 等级筛选。 */
levelId?: number
/** 后台待验收筛选:普通单按接单人,拼单按参与打手等级。 */ /** 后台待验收筛选:普通单按接单人,拼单按参与打手等级。 */
workerLevelIds?: number[] workerLevelIds?: number[]
categoryId?: number categoryId?: number
@@ -236,8 +236,15 @@ export async function listWorkerUsers({
keyword = '', keyword = '',
workerType = '', workerType = '',
workerId = 0, workerId = 0,
levelId = 0,
}: ListInput = {}): Promise<{ items: WorkerUserRow[]; total: number }> { }: ListInput = {}): Promise<{ items: WorkerUserRow[]; total: number }> {
const { whereClause, params } = buildWorkerUserWhere({ status, keyword, workerType, workerId }) const { whereClause, params } = buildWorkerUserWhere({
status,
keyword,
workerType,
workerId,
levelId,
})
const totalResult = await query<{ total: number }>( const totalResult = await query<{ total: number }>(
`SELECT COUNT(*)::int AS total FROM worker_users wu ${whereClause}`, `SELECT COUNT(*)::int AS total FROM worker_users wu ${whereClause}`,
params, params,
@@ -299,7 +306,8 @@ function buildWorkerUserWhere({
keyword = '', keyword = '',
workerType = '', workerType = '',
workerId = 0, workerId = 0,
}: Pick<ListInput, 'status' | 'keyword' | 'workerType' | 'workerId'>) { levelId = 0,
}: Pick<ListInput, 'status' | 'keyword' | 'workerType' | 'workerId' | 'levelId'>) {
const filters: string[] = [] const filters: string[] = []
const params: unknown[] = [] const params: unknown[] = []
if (status) { if (status) {
@@ -320,6 +328,10 @@ function buildWorkerUserWhere({
params.push(workerId) params.push(workerId)
filters.push(`wu.id = $${params.length}`) filters.push(`wu.id = $${params.length}`)
} }
if (levelId) {
params.push(levelId)
filters.push(`wu.level_id = $${params.length}`)
}
return { return {
whereClause: filters.length > 0 ? `WHERE ${filters.join(' AND ')}` : '', whereClause: filters.length > 0 ? `WHERE ${filters.join(' AND ')}` : '',
params, params,
@@ -27,10 +27,12 @@ export async function listAdminWorkerUsers(query: JsonObject = {}) {
const page = normalizePage(query.page) const page = normalizePage(query.page)
const pageSize = normalizePageSize(query.pageSize) const pageSize = normalizePageSize(query.pageSize)
const workerId = normalizeOptionalId(query.workerId ?? query.worker_id) || 0 const workerId = normalizeOptionalId(query.workerId ?? query.worker_id) || 0
const levelId = normalizeOptionalId(query.levelId ?? query.level_id) || 0
const { items, total } = await listWorkerUsers({ const { items, total } = await listWorkerUsers({
page, page,
pageSize, pageSize,
workerId, workerId,
levelId,
status: String(query.status || '').trim(), status: String(query.status || '').trim(),
keyword: String(query.keyword || '').trim(), keyword: String(query.keyword || '').trim(),
workerType: String(query.workerType || query.worker_type || '').trim(), workerType: String(query.workerType || query.worker_type || '').trim(),
@@ -57,6 +57,7 @@ export default function WorkersPanel() {
const [keywordInput, setKeywordInput] = useState('') const [keywordInput, setKeywordInput] = useState('')
const [keyword, setKeyword] = useState('') const [keyword, setKeyword] = useState('')
const [workerType, setWorkerType] = useState('') const [workerType, setWorkerType] = useState('')
const [levelId, setLevelId] = useState(0)
const [targetWorkerId, setTargetWorkerId] = useState(0) const [targetWorkerId, setTargetWorkerId] = useState(0)
const [page, setPage] = useState(1) const [page, setPage] = useState(1)
const [pageSize, setPageSize] = useState(ADMIN_DEFAULT_PAGE_SIZE) const [pageSize, setPageSize] = useState(ADMIN_DEFAULT_PAGE_SIZE)
@@ -91,6 +92,7 @@ export default function WorkersPanel() {
setKeyword('') setKeyword('')
setStatus('') setStatus('')
setWorkerType('') setWorkerType('')
setLevelId(0)
setPage(1) setPage(1)
}, [searchParams]) }, [searchParams])
@@ -100,6 +102,7 @@ export default function WorkersPanel() {
status, status,
keyword, keyword,
workerType, workerType,
levelId,
targetWorkerId, targetWorkerId,
page, page,
pageSize, pageSize,
@@ -109,6 +112,7 @@ export default function WorkersPanel() {
status, status,
keyword, keyword,
workerType, workerType,
levelId: levelId || undefined,
workerId: targetWorkerId || undefined, workerId: targetWorkerId || undefined,
page, page,
pageSize, pageSize,
@@ -152,6 +156,7 @@ export default function WorkersPanel() {
setKeyword('') setKeyword('')
setStatus('') setStatus('')
setWorkerType('') setWorkerType('')
setLevelId(0)
setTargetWorkerId(0) setTargetWorkerId(0)
setPage(1) setPage(1)
setSearchParams( setSearchParams(
@@ -474,6 +479,21 @@ export default function WorkersPanel() {
setPage(1) setPage(1)
}} }}
/> />
<Select
allowClear
value={levelId || undefined}
style={{ width: 140 }}
placeholder="全部等级"
loading={levelsQuery.isLoading}
options={(levelsQuery.data?.data.items || []).map((item) => ({
value: item.levelId,
label: item.name,
}))}
onChange={(nextLevelId) => {
setLevelId(nextLevelId || 0)
setPage(1)
}}
/>
<Button type="primary" icon={<SearchOutlined />} onClick={searchWorkers}> <Button type="primary" icon={<SearchOutlined />} onClick={searchWorkers}>
</Button> </Button>