管理后台新增打手详情抽屉聚合钱包流水待解冻与订单数据
This commit is contained in:
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user