拆分后台工单押金服务
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user