diff --git a/apps/backend/src/services/worker-platform/admin-service.ts b/apps/backend/src/services/worker-platform/admin-service.ts index 1378ebf8..2126cb0c 100644 --- a/apps/backend/src/services/worker-platform/admin-service.ts +++ b/apps/backend/src/services/worker-platform/admin-service.ts @@ -10,7 +10,6 @@ import { createWorkProductMatchLog, createWorkOrder, createWorkOrderEvent, - deductPendingDepositUnfreeze, getWorkOrderByOrderItemId, listWorkOrders, listWorkProductRules, @@ -69,66 +68,7 @@ export { reviewAdminWorkerCancelRequest, } from './admin-worker-cancel-service.js' -export async function deductAdminWorkOrderPendingDeposit( - workOrderId: number | string, - payload: JsonObject = {}, - actorName = '', -) { - const workOrder = await getRequiredWorkOrder(workOrderId) - if (workOrder.status !== WORK_ORDER_STATUS.ACCEPTED) { - throw createHttpError('只有已验收的工单可以扣减待解冻押金', { - statusCode: 409, - errorCode: 'work_order_deduct_pending_status_invalid', - }) - } - const amount = normalizeAmountFen(payload.amount ?? payload.amountYuan, 0) - const note = String(payload.note || payload.reason || '').trim() - if (amount <= 0) { - throw createHttpError('扣减金额必须大于 0', { - statusCode: 400, - errorCode: 'work_order_deduct_pending_amount_invalid', - }) - } - if (!note) { - throw createHttpError('请填写扣减原因', { - statusCode: 400, - errorCode: 'work_order_deduct_pending_note_required', - }) - } - const result = await deductPendingDepositUnfreeze({ - workOrderId: workOrder.id, - amount, - note, - now: nowIso(), - }) - if (result.failureReason === 'no_pending_deposit') { - throw createHttpError('该工单没有待解冻的押金', { - statusCode: 409, - errorCode: 'work_order_deduct_pending_none', - }) - } - if (result.failureReason === 'amount_exceeds_pending') { - throw createHttpError('扣减金额超过该工单待解冻押金总额', { - statusCode: 409, - errorCode: 'work_order_deduct_pending_amount_exceeds', - }) - } - await createWorkOrderEvent({ - workOrderId: workOrder.id, - actorType: 'admin', - actorId: actorName, - eventType: 'pending_deposit_deducted', - fromStatus: workOrder.status, - toStatus: workOrder.status, - payloadJson: JSON.stringify({ amount, note }), - now: nowIso(), - }) - publishWorkOrderRealtimeChange({ - workOrderId: Number(workOrder.id), - workerIds: await resolveWorkOrderRealtimeWorkerIds(workOrder), - }) - return { deductedAmount: result.deductedAmount } -} +export { deductAdminWorkOrderPendingDeposit } from './admin-work-order-deposit-service.js' export { getAdminWorkOrderSharing, diff --git a/apps/backend/src/services/worker-platform/admin-work-order-deposit-service.ts b/apps/backend/src/services/worker-platform/admin-work-order-deposit-service.ts new file mode 100644 index 00000000..6ca6abfb --- /dev/null +++ b/apps/backend/src/services/worker-platform/admin-work-order-deposit-service.ts @@ -0,0 +1,73 @@ +import { WORK_ORDER_STATUS } from '../../domain/work-order-status.js' +import { + createWorkOrderEvent, + deductPendingDepositUnfreeze, +} 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 { publishWorkOrderRealtimeChange } from '../realtime/realtime-event-service.js' +import { normalizeAmountFen } from './mappers.js' +import { resolveWorkOrderRealtimeWorkerIds } from './admin-work-order-realtime-service.js' +import { getRequiredWorkOrder } from './worker-session-context-service.js' + +export async function deductAdminWorkOrderPendingDeposit( + workOrderId: number | string, + payload: JsonObject = {}, + actorName = '', +) { + const workOrder = await getRequiredWorkOrder(workOrderId) + if (workOrder.status !== WORK_ORDER_STATUS.ACCEPTED) { + throw createHttpError('只有已验收的工单可以扣减待解冻押金', { + statusCode: 409, + errorCode: 'work_order_deduct_pending_status_invalid', + }) + } + const amount = normalizeAmountFen(payload.amount ?? payload.amountYuan, 0) + const note = String(payload.note || payload.reason || '').trim() + if (amount <= 0) { + throw createHttpError('扣减金额必须大于 0', { + statusCode: 400, + errorCode: 'work_order_deduct_pending_amount_invalid', + }) + } + if (!note) { + throw createHttpError('请填写扣减原因', { + statusCode: 400, + errorCode: 'work_order_deduct_pending_note_required', + }) + } + const result = await deductPendingDepositUnfreeze({ + workOrderId: workOrder.id, + amount, + note, + now: nowIso(), + }) + if (result.failureReason === 'no_pending_deposit') { + throw createHttpError('该工单没有待解冻的押金', { + statusCode: 409, + errorCode: 'work_order_deduct_pending_none', + }) + } + if (result.failureReason === 'amount_exceeds_pending') { + throw createHttpError('扣减金额超过该工单待解冻押金总额', { + statusCode: 409, + errorCode: 'work_order_deduct_pending_amount_exceeds', + }) + } + await createWorkOrderEvent({ + workOrderId: workOrder.id, + actorType: 'admin', + actorId: actorName, + eventType: 'pending_deposit_deducted', + fromStatus: workOrder.status, + toStatus: workOrder.status, + payloadJson: JSON.stringify({ amount, note }), + now: nowIso(), + }) + publishWorkOrderRealtimeChange({ + workOrderId: Number(workOrder.id), + workerIds: await resolveWorkOrderRealtimeWorkerIds(workOrder), + }) + return { deductedAmount: result.deductedAmount } +} diff --git a/apps/backend/src/services/worker-platform/index.ts b/apps/backend/src/services/worker-platform/index.ts index b4db2c6f..da095010 100644 --- a/apps/backend/src/services/worker-platform/index.ts +++ b/apps/backend/src/services/worker-platform/index.ts @@ -35,6 +35,7 @@ export * from './admin-mock-work-order-service.js' export * from './admin-work-order-management-service.js' export * from './admin-worker-platform-summary-service.js' export * from './admin-work-order-assignment-service.js' +export * from './admin-work-order-deposit-service.js' export { acceptAdminWorkOrder, acceptAdminWorkOrderShare,