diff --git a/apps/backend/src/services/worker-platform/admin-service.ts b/apps/backend/src/services/worker-platform/admin-service.ts index fe59cd36..b3f10430 100644 --- a/apps/backend/src/services/worker-platform/admin-service.ts +++ b/apps/backend/src/services/worker-platform/admin-service.ts @@ -55,7 +55,6 @@ import { mapWorkOrderAdmin, mapWorkOrderShare, normalizeAmountFen, - normalizeBoolean, normalizeInteger, normalizeOptionalId, normalizePositiveInteger, @@ -77,7 +76,6 @@ import { import { ensureWorkerPlatformDefaults } from './worker-platform-defaults.js' import { normalizeWorkOrderTimeoutPolicy } from './work-order-timeout-policy.js' import { getRequiredWorkOrder, getRequiredWorker } from './worker-session-context-service.js' -import { resolveSharingQuantity } from './admin-worker-catalog-service.js' import { getKuaishouIndustrySourceConfig, listKuaishouIndustryShopConfigs, @@ -285,77 +283,10 @@ export async function deductAdminWorkOrderPendingDeposit( return { deductedAmount: result.deductedAmount } } -export async function getAdminWorkOrderSharing(workOrderId: number | string) { - const workOrder = await getRequiredWorkOrder(workOrderId) - const shares = await listWorkOrderShares(workOrder.id) - return { - order: mapWorkOrderAdmin(workOrder, shares), - shares: shares.map(mapWorkOrderShare), - } -} - -export async function updateAdminWorkOrderSharing( - workOrderId: number | string, - payload: JsonObject = {}, - actorName = '', -) { - const workOrder = await getRequiredWorkOrder(workOrderId) - if (!mapWorkOrderAdmin(workOrder).capabilities.canConfigureSharing) { - throw createHttpError('只有待完善、未分配或待抢单的工单可以配置拼单', { - statusCode: 409, - errorCode: 'work_order_sharing_config_status_invalid', - }) - } - const enabled = normalizeBoolean( - payload.enabled ?? payload.sharingEnabled ?? payload.sharing_enabled, - false, - ) - const unitReward = normalizeAmountFen( - payload.unitReward ?? payload.sharingUnitReward ?? payload.sharingUnitRewardYuan, - 0, - ) - const totalAmount = normalizeAmountFen( - payload.totalAmount ?? payload.sharingTotalAmount ?? payload.sharingTotalAmountYuan, - 0, - ) - const totalQuantity = resolveSharingQuantity( - totalAmount, - normalizePositiveInteger( - payload.totalQuantity ?? payload.sharingTotalQuantity ?? payload.sharing_total_quantity, - 1, - ), - unitReward, - ) - const resolvedTotalAmount = totalAmount > 0 ? totalAmount : unitReward * totalQuantity - const now = nowIso() - const updated = await updateWorkOrder(workOrder.id, { - sharing_enabled: enabled, - sharing_total_quantity: totalQuantity, - sharing_unit_reward: unitReward, - reward_amount: enabled ? resolvedTotalAmount : workOrder.reward_amount, - updated_at: now, - }) - await createWorkOrderEvent({ - workOrderId: workOrder.id, - actorType: 'admin', - actorId: actorName, - eventType: 'sharing_config_updated', - fromStatus: workOrder.status, - toStatus: updated?.status || workOrder.status, - payloadJson: JSON.stringify({ - enabled, - totalQuantity, - unitReward, - totalAmount: resolvedTotalAmount, - }), - now, - }) - publishWorkOrderRealtimeChange({ - workOrderId: Number(workOrder.id), - hallChanged: workOrder.status === WORK_ORDER_STATUS.OPEN, - }) - return { order: mapWorkOrderAdmin(updated || workOrder) } -} +export { + getAdminWorkOrderSharing, + updateAdminWorkOrderSharing, +} from './admin-work-order-sharing-service.js' export async function submitAdminWorkOrderMaterial( workOrderId: number | string, diff --git a/apps/backend/src/services/worker-platform/admin-work-order-sharing-service.ts b/apps/backend/src/services/worker-platform/admin-work-order-sharing-service.ts new file mode 100644 index 00000000..b850c799 --- /dev/null +++ b/apps/backend/src/services/worker-platform/admin-work-order-sharing-service.ts @@ -0,0 +1,91 @@ +import { WORK_ORDER_STATUS } from '../../domain/work-order-status.js' +import { + createWorkOrderEvent, + listWorkOrderShares, + updateWorkOrder, +} 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 { + mapWorkOrderAdmin, + mapWorkOrderShare, + normalizeAmountFen, + normalizeBoolean, + normalizePositiveInteger, +} from './mappers.js' +import { resolveSharingQuantity } from './admin-worker-catalog-service.js' +import { getRequiredWorkOrder } from './worker-session-context-service.js' + +export async function getAdminWorkOrderSharing(workOrderId: number | string) { + const workOrder = await getRequiredWorkOrder(workOrderId) + const shares = await listWorkOrderShares(workOrder.id) + return { + order: mapWorkOrderAdmin(workOrder, shares), + shares: shares.map(mapWorkOrderShare), + } +} + +export async function updateAdminWorkOrderSharing( + workOrderId: number | string, + payload: JsonObject = {}, + actorName = '', +) { + const workOrder = await getRequiredWorkOrder(workOrderId) + if (!mapWorkOrderAdmin(workOrder).capabilities.canConfigureSharing) { + throw createHttpError('只有待完善、未分配或待抢单的工单可以配置拼单', { + statusCode: 409, + errorCode: 'work_order_sharing_config_status_invalid', + }) + } + const enabled = normalizeBoolean( + payload.enabled ?? payload.sharingEnabled ?? payload.sharing_enabled, + false, + ) + const unitReward = normalizeAmountFen( + payload.unitReward ?? payload.sharingUnitReward ?? payload.sharingUnitRewardYuan, + 0, + ) + const totalAmount = normalizeAmountFen( + payload.totalAmount ?? payload.sharingTotalAmount ?? payload.sharingTotalAmountYuan, + 0, + ) + const totalQuantity = resolveSharingQuantity( + totalAmount, + normalizePositiveInteger( + payload.totalQuantity ?? payload.sharingTotalQuantity ?? payload.sharing_total_quantity, + 1, + ), + unitReward, + ) + const resolvedTotalAmount = totalAmount > 0 ? totalAmount : unitReward * totalQuantity + const now = nowIso() + const updated = await updateWorkOrder(workOrder.id, { + sharing_enabled: enabled, + sharing_total_quantity: totalQuantity, + sharing_unit_reward: unitReward, + reward_amount: enabled ? resolvedTotalAmount : workOrder.reward_amount, + updated_at: now, + }) + await createWorkOrderEvent({ + workOrderId: workOrder.id, + actorType: 'admin', + actorId: actorName, + eventType: 'sharing_config_updated', + fromStatus: workOrder.status, + toStatus: updated?.status || workOrder.status, + payloadJson: JSON.stringify({ + enabled, + totalQuantity, + unitReward, + totalAmount: resolvedTotalAmount, + }), + now, + }) + publishWorkOrderRealtimeChange({ + workOrderId: Number(workOrder.id), + hallChanged: workOrder.status === WORK_ORDER_STATUS.OPEN, + }) + return { order: mapWorkOrderAdmin(updated || workOrder) } +} diff --git a/apps/backend/src/services/worker-platform/index.ts b/apps/backend/src/services/worker-platform/index.ts index 51e6264e..c6302346 100644 --- a/apps/backend/src/services/worker-platform/index.ts +++ b/apps/backend/src/services/worker-platform/index.ts @@ -28,6 +28,7 @@ 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 './admin-work-order-sharing-service.js' export * from './worker-product-match-config-service.js' export * from './worker-announcement-config-service.js' export * from './worker-hall-config-service.js'