拆分后台撤单审核服务

This commit is contained in:
yml2213
2026-08-21 17:10:26 +08:00
parent 91cd4cf280
commit 15379b20b9
3 changed files with 85 additions and 74 deletions
@@ -23,8 +23,6 @@ import {
listWorkOrderShares,
resolveProblemWorkOrder,
reopenCancelledWorkOrder,
listAdminWorkerCancelRequests as listWorkerCancelRequestsForAdmin,
reviewWorkerCancelRequest,
updateWorkOrder,
updateWorkOrderBasic,
type WorkOrderRow,
@@ -56,7 +54,6 @@ import {
DEFAULT_DEPOSIT_THRESHOLD_AMOUNT,
mapWorkOrderAdmin,
mapWorkOrderShare,
mapWorkerCancelRequest,
normalizeAmountFen,
normalizeBoolean,
normalizeInteger,
@@ -222,78 +219,10 @@ function resolveAssignedDeadlineAt(timeoutMinutes: number, now: string): string
export { getAdminWorkOrderEvents, listAdminWorkOrders } from './admin-work-order-query-service.js'
export async function listAdminWorkerCancelRequests(query: JsonObject = {}) {
const status = String(query.status || 'pending').trim()
const normalizedStatus = ['pending', 'approved', 'rejected'].includes(status) ? status : 'pending'
return {
items: (await listWorkerCancelRequestsForAdmin(normalizedStatus)).map(mapWorkerCancelRequest),
}
}
export {
listAdminWorkerOrderFeedbacks,
resolveAdminWorkerOrderFeedback,
} from './admin-worker-feedback-service.js'
export async function reviewAdminWorkerCancelRequest(
requestId: number | string,
payload: JsonObject = {},
actorName = '',
) {
const approved = payload.approved === true || String(payload.action || '').trim() === 'approve'
const reviewNote = String(payload.reviewNote || payload.note || '').trim()
if (!reviewNote) {
throw createHttpError('请填写审核备注', {
statusCode: 400,
errorCode: 'worker_cancel_request_review_note_required',
})
}
const result = await reviewWorkerCancelRequest({
requestId: Number(requestId),
approved,
reviewNote,
actorName,
now: nowIso(),
})
if (result.failureReason === 'request_not_found') {
throw createHttpError('撤单申请不存在', {
statusCode: 404,
errorCode: 'worker_cancel_request_not_found',
})
}
if (result.failureReason === 'request_not_pending') {
throw createHttpError('该撤单申请已审核,请刷新后重试', {
statusCode: 409,
errorCode: 'worker_cancel_request_not_pending',
})
}
if (!result.request || !result.order) {
throw createHttpError('订单状态已变化,无法审核该撤单申请', {
statusCode: 409,
errorCode: 'worker_cancel_request_target_changed',
})
}
await resolveAdminNotificationEntity(
'worker_cancel_request',
Number(result.request.id),
approved ? 'approved' : 'rejected',
)
const workerId = Number(result.request.worker_id)
publishWorkOrderRealtimeChange({
workOrderId: Number(result.order.id),
workerIds: workerId > 0 ? [workerId] : [],
hallChanged: approved,
})
if (approved && workerId > 0) publishWorkerWalletRealtimeChange(workerId)
return {
request: mapWorkerCancelRequest(result.request),
order: mapWorkOrderAdmin(result.order),
approved,
releasedDepositAmount: result.releasedDepositAmount,
levelChanged: result.levelChanged,
accountDisabled: result.accountDisabled,
}
}
listAdminWorkerCancelRequests,
reviewAdminWorkerCancelRequest,
} from './admin-worker-cancel-service.js'
export async function deductAdminWorkOrderPendingDeposit(
workOrderId: number | string,
@@ -0,0 +1,81 @@
import {
listAdminWorkerCancelRequests as listWorkerCancelRequestsForAdmin,
reviewWorkerCancelRequest,
} from '../../repositories/worker-platform/index.js'
import type { JsonObject } from '../../types/json.js'
import { createHttpError } from '../../utils/http.js'
import { nowIso } from '../../utils/time.js'
import { resolveAdminNotificationEntity } from '../admin/admin-notification-service.js'
import {
publishWorkerWalletRealtimeChange,
publishWorkOrderRealtimeChange,
} from '../realtime/realtime-event-service.js'
import { mapWorkOrderAdmin, mapWorkerCancelRequest } from './mappers.js'
export async function listAdminWorkerCancelRequests(query: JsonObject = {}) {
const status = String(query.status || 'pending').trim()
const normalizedStatus = ['pending', 'approved', 'rejected'].includes(status) ? status : 'pending'
return {
items: (await listWorkerCancelRequestsForAdmin(normalizedStatus)).map(mapWorkerCancelRequest),
}
}
export async function reviewAdminWorkerCancelRequest(
requestId: number | string,
payload: JsonObject = {},
actorName = '',
) {
const approved = payload.approved === true || String(payload.action || '').trim() === 'approve'
const reviewNote = String(payload.reviewNote || payload.note || '').trim()
if (!reviewNote) {
throw createHttpError('请填写审核备注', {
statusCode: 400,
errorCode: 'worker_cancel_request_review_note_required',
})
}
const result = await reviewWorkerCancelRequest({
requestId: Number(requestId),
approved,
reviewNote,
actorName,
now: nowIso(),
})
if (result.failureReason === 'request_not_found') {
throw createHttpError('撤单申请不存在', {
statusCode: 404,
errorCode: 'worker_cancel_request_not_found',
})
}
if (result.failureReason === 'request_not_pending') {
throw createHttpError('该撤单申请已审核,请刷新后重试', {
statusCode: 409,
errorCode: 'worker_cancel_request_not_pending',
})
}
if (!result.request || !result.order) {
throw createHttpError('订单状态已变化,无法审核该撤单申请', {
statusCode: 409,
errorCode: 'worker_cancel_request_target_changed',
})
}
await resolveAdminNotificationEntity(
'worker_cancel_request',
Number(result.request.id),
approved ? 'approved' : 'rejected',
)
const workerId = Number(result.request.worker_id)
publishWorkOrderRealtimeChange({
workOrderId: Number(result.order.id),
workerIds: workerId > 0 ? [workerId] : [],
hallChanged: approved,
})
if (approved && workerId > 0) publishWorkerWalletRealtimeChange(workerId)
return {
request: mapWorkerCancelRequest(result.request),
order: mapWorkOrderAdmin(result.order),
approved,
releasedDepositAmount: result.releasedDepositAmount,
levelChanged: result.levelChanged,
accountDisabled: result.accountDisabled,
}
}
@@ -27,6 +27,7 @@ export * from './admin-worker-config-service.js'
export * from './admin-worker-user-service.js'
export * from './admin-work-order-query-service.js'
export * from './admin-worker-feedback-service.js'
export * from './admin-worker-cancel-service.js'
export * from './worker-product-match-config-service.js'
export * from './worker-announcement-config-service.js'
export * from './worker-hall-config-service.js'