diff --git a/apps/backend/src/services/worker-platform/admin-service.ts b/apps/backend/src/services/worker-platform/admin-service.ts index e6ab4133..fe59cd36 100644 --- a/apps/backend/src/services/worker-platform/admin-service.ts +++ b/apps/backend/src/services/worker-platform/admin-service.ts @@ -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, diff --git a/apps/backend/src/services/worker-platform/admin-worker-cancel-service.ts b/apps/backend/src/services/worker-platform/admin-worker-cancel-service.ts new file mode 100644 index 00000000..538250a4 --- /dev/null +++ b/apps/backend/src/services/worker-platform/admin-worker-cancel-service.ts @@ -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, + } +} diff --git a/apps/backend/src/services/worker-platform/index.ts b/apps/backend/src/services/worker-platform/index.ts index 4e20809e..51e6264e 100644 --- a/apps/backend/src/services/worker-platform/index.ts +++ b/apps/backend/src/services/worker-platform/index.ts @@ -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'