管理后台新增打手详情抽屉聚合钱包流水待解冻与订单数据

This commit is contained in:
yml2213
2026-08-22 19:56:23 +08:00
parent 90ff15b627
commit 1b8fdff162
8 changed files with 631 additions and 6 deletions
@@ -46,3 +46,39 @@ export async function listDueDepositUnfreezes({
)
return result.rows
}
/** 管理端按打手列出全部解冻记录(含未到期与已释放),观察待解冻到账进度。 */
export async function listWorkerDepositUnfreezes({
workerId,
status = '',
page = 1,
pageSize = 20,
}: {
workerId: number
status?: string
page?: number
pageSize?: number
}): Promise<{ items: WorkerDepositUnfreezeRow[]; total: number }> {
const params: unknown[] = [Number(workerId)]
const normalizedStatus = String(status || '').trim()
let statusClause = ''
if (normalizedStatus) {
params.push(normalizedStatus)
statusClause = ` AND status = $${params.length}`
}
const totalResult = await query<{ total: number }>(
`SELECT COUNT(*)::int AS total FROM worker_deposit_unfreezes WHERE worker_id = $1${statusClause}`,
params,
)
params.push(pageSize, (page - 1) * pageSize)
const result = await query<WorkerDepositUnfreezeRow>(
`
SELECT * FROM worker_deposit_unfreezes
WHERE worker_id = $1${statusClause}
ORDER BY unfreeze_at DESC, id DESC
LIMIT $${params.length - 1} OFFSET $${params.length}
`,
params,
)
return { items: result.rows, total: Number(totalResult.rows[0]?.total || 0) }
}
@@ -2,7 +2,10 @@ import { Router } from 'express'
import {
creditAdminWorkerWallet,
getAdminWorkerDetail,
listAdminWorkerDepositUnfreezes,
listAdminWorkerUsers,
listAdminWorkerWalletLedgers,
listAdminWorkerWithdrawalAccounts,
resetAdminWorkerPassword,
reviewAdminWorkerUser,
@@ -22,6 +25,42 @@ router.get(
}),
)
router.get(
'/worker-platform/workers/:workerId/detail',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler((req) => getAdminWorkerDetail(String(req.params.workerId || '')), {
successMessage: 'ok',
errorMessage: '读取打手详情失败',
scope: '[admin/worker-platform/workers/:workerId/detail]',
}),
)
router.get(
'/worker-platform/workers/:workerId/wallet-ledgers',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler(
(req) => listAdminWorkerWalletLedgers(String(req.params.workerId || ''), req.query),
{
successMessage: 'ok',
errorMessage: '读取打手资金流水失败',
scope: '[admin/worker-platform/workers/:workerId/wallet-ledgers]',
},
),
)
router.get(
'/worker-platform/workers/:workerId/deposit-unfreezes',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler(
(req) => listAdminWorkerDepositUnfreezes(String(req.params.workerId || ''), req.query),
{
successMessage: 'ok',
errorMessage: '读取打手待解冻记录失败',
scope: '[admin/worker-platform/workers/:workerId/deposit-unfreezes]',
},
),
)
router.post(
'/worker-platform/workers/:workerId/review',
requireAdminRoles(['admin', 'operator']),
@@ -0,0 +1,80 @@
import type { WorkerDepositUnfreezeRow } from '../../repositories/worker-platform/index.js'
import {
countWorkerAcceptedOrders,
countWorkerActiveOrders,
countWorkerTimeoutEvents,
getWorkerOrderOverview,
listWorkerDepositUnfreezes,
listWorkerWalletLedgers,
} from '../../repositories/worker-platform/index.js'
import type { JsonObject } from '../../types/json.js'
import { normalizePage, normalizePageSize } from '../admin/admin-query-utils.js'
import { mapWalletLedger, mapWorkerUser } from './mappers.js'
import { getRequiredWorker } from './worker-session-context-service.js'
/** 管理端打手详情:聚合账号钱包、接单统计与订单概览,全部只读。 */
export async function getAdminWorkerDetail(workerId: number | string) {
const worker = await getRequiredWorker(workerId)
const [activeOrderCount, acceptedOrderCount, timeoutOrderCount, orderOverview] =
await Promise.all([
countWorkerActiveOrders(worker.id),
countWorkerAcceptedOrders(worker.id),
countWorkerTimeoutEvents(worker.id),
getWorkerOrderOverview(worker.id),
])
return {
worker: mapWorkerUser(worker),
summary: { activeOrderCount, acceptedOrderCount, timeoutOrderCount },
orderOverview,
}
}
export async function listAdminWorkerWalletLedgers(
workerId: number | string,
payload: JsonObject = {},
) {
const worker = await getRequiredWorker(workerId)
const page = normalizePage(payload.page)
const pageSize = normalizePageSize(payload.pageSize)
const ledgerType = String(payload.ledgerType || payload.ledger_type || '').trim()
const { items, total } = await listWorkerWalletLedgers({
page,
pageSize,
workerId: Number(worker.id),
ledgerType,
})
return { items: items.map(mapWalletLedger), pagination: { page, pageSize, total } }
}
export async function listAdminWorkerDepositUnfreezes(
workerId: number | string,
payload: JsonObject = {},
) {
const worker = await getRequiredWorker(workerId)
const page = normalizePage(payload.page)
const pageSize = normalizePageSize(payload.pageSize)
const status = String(payload.status || '').trim()
const { items, total } = await listWorkerDepositUnfreezes({
workerId: Number(worker.id),
status,
page,
pageSize,
})
return {
items: items.map(mapDepositUnfreeze),
pagination: { page, pageSize, total },
}
}
function mapDepositUnfreeze(row: WorkerDepositUnfreezeRow) {
return {
id: Number(row.id),
workerId: Number(row.worker_id),
workOrderId: Number(row.work_order_id),
amount: Number(row.amount || 0),
status: row.status,
unfreezeAt: row.unfreeze_at,
releasedAt: row.released_at || null,
createdAt: row.created_at,
}
}
@@ -28,6 +28,7 @@ export * from './admin-worker-leaderboard-service.js'
export * from './admin-kuaishou-match-service.js'
export * from './admin-worker-config-service.js'
export * from './admin-worker-user-service.js'
export * from './admin-worker-detail-service.js'
export * from './admin-work-order-query-service.js'
export * from './admin-worker-feedback-service.js'
export * from './admin-worker-cancel-service.js'