拆分后台工单押金服务

This commit is contained in:
yml2213
2026-08-21 17:32:58 +08:00
parent 5af2dd08e0
commit 2856d2a313
3 changed files with 75 additions and 61 deletions
@@ -10,7 +10,6 @@ import {
createWorkProductMatchLog, createWorkProductMatchLog,
createWorkOrder, createWorkOrder,
createWorkOrderEvent, createWorkOrderEvent,
deductPendingDepositUnfreeze,
getWorkOrderByOrderItemId, getWorkOrderByOrderItemId,
listWorkOrders, listWorkOrders,
listWorkProductRules, listWorkProductRules,
@@ -69,66 +68,7 @@ export {
reviewAdminWorkerCancelRequest, reviewAdminWorkerCancelRequest,
} from './admin-worker-cancel-service.js' } from './admin-worker-cancel-service.js'
export async function deductAdminWorkOrderPendingDeposit( export { deductAdminWorkOrderPendingDeposit } from './admin-work-order-deposit-service.js'
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 { export {
getAdminWorkOrderSharing, getAdminWorkOrderSharing,
@@ -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 }
}
@@ -35,6 +35,7 @@ export * from './admin-mock-work-order-service.js'
export * from './admin-work-order-management-service.js' export * from './admin-work-order-management-service.js'
export * from './admin-worker-platform-summary-service.js' export * from './admin-worker-platform-summary-service.js'
export * from './admin-work-order-assignment-service.js' export * from './admin-work-order-assignment-service.js'
export * from './admin-work-order-deposit-service.js'
export { export {
acceptAdminWorkOrder, acceptAdminWorkOrder,
acceptAdminWorkOrderShare, acceptAdminWorkOrderShare,