拆分打手订单基础服务

This commit is contained in:
yml2213
2026-08-21 16:52:32 +08:00
parent 1076addead
commit b1077ce6ef
4 changed files with 85 additions and 65 deletions
@@ -10,6 +10,8 @@ export * from './worker-registration-service.js'
export * from './worker-login-service.js'
export * from './worker-profile-service.js'
export * from './worker-hall-service.js'
export * from './worker-order-timeout-service.js'
export * from './worker-order-realtime-service.js'
export * from './worker-platform-defaults.js'
export * from './work-order-timeout-policy.js'
export * from './after-sales-service.js'
@@ -0,0 +1,32 @@
import { listWorkOrderShares } from '../../repositories/worker-platform/index.js'
import {
publishWorkerWalletRealtimeChange,
publishWorkOrderRealtimeChange,
} from '../realtime/realtime-event-service.js'
/** 拼单工单同步所有参与打手,避免仅主打手页面更新。 */
export async function publishWorkOrderParticipantChange(
workOrderId: number,
options: {
workerIds?: number[]
hallChanged?: boolean
walletChangedWorkerIds?: number[]
} = {},
) {
const shares = await listWorkOrderShares(workOrderId)
const workerIds = [
...(options.workerIds || []),
...shares.map((share) => Number(share.worker_id)),
].filter(
(workerId, index, values) =>
Number.isInteger(workerId) && workerId > 0 && values.indexOf(workerId) === index,
)
publishWorkOrderRealtimeChange({
workOrderId,
workerIds,
...(options.hallChanged ? { hallChanged: true } : {}),
})
for (const workerId of options.walletChangedWorkerIds || []) {
publishWorkerWalletRealtimeChange(workerId)
}
}
@@ -0,0 +1,47 @@
import { WORK_ORDER_STATUS } from '../../domain/work-order-status.js'
import {
listOverdueWorkOrders,
settleOverdueWorkOrder,
} from '../../repositories/worker-platform/index.js'
import { nowIso } from '../../utils/time.js'
import {
publishWorkerWalletRealtimeChange,
publishWorkOrderRealtimeChange,
} from '../realtime/realtime-event-service.js'
import { normalizeWorkOrderTimeoutPolicy } from './work-order-timeout-policy.js'
export async function settleOverdueWorkOrders(options: { limit?: number; workerId?: number } = {}) {
const overdue = await listOverdueWorkOrders({
limit: Math.max(1, Number(options.limit || 50)),
workerId: Number(options.workerId || 0),
})
let processedCount = 0
let skippedCount = 0
for (const workOrder of overdue) {
const result = await settleOverdueWorkOrder({
workOrderId: workOrder.id,
policy: normalizeWorkOrderTimeoutPolicy(workOrder.timeout_policy),
now: nowIso(),
})
if (result.order) {
processedCount += 1
publishWorkOrderRealtimeChange({
workOrderId: Number(workOrder.id),
workerIds: Number(workOrder.assigned_worker_id)
? [Number(workOrder.assigned_worker_id)]
: [],
hallChanged: result.order.status === WORK_ORDER_STATUS.OPEN,
})
if (Number(workOrder.assigned_worker_id)) {
publishWorkerWalletRealtimeChange(Number(workOrder.assigned_worker_id))
}
} else {
skippedCount += 1
}
}
return {
checkedCount: overdue.length,
processedCount,
skippedCount,
}
}
@@ -11,6 +11,7 @@ import {
createWorkOrderEvent,
getLatestWorkerSmsCode,
recordWorkerSmsCodeFailure,
settleOverdueWorkOrder,
getWorkerUserById,
getWorkerUserByPhone,
getWorkerUserByUsername,
@@ -33,10 +34,7 @@ import {
listWorkerWorkOrderViews,
listWorkOrders,
listWorkOrderEventsByOrderId,
listWorkOrderShares,
getWorkerCancelRequestRisk,
listOverdueWorkOrders,
settleOverdueWorkOrder,
submitWorkOrderShareAcceptance,
updateWorkOrder,
updateWorkOrderAcceptanceRecord,
@@ -123,6 +121,8 @@ import {
verifyWorkerSessionToken,
} from './worker-session-auth-service.js'
import { normalizeWorkOrderTimeoutPolicy } from './work-order-timeout-policy.js'
import { publishWorkOrderParticipantChange } from './worker-order-realtime-service.js'
import { settleOverdueWorkOrders } from './worker-order-timeout-service.js'
const VIP_AUTO_ACCEPT_EVIDENCE_WINDOW_HOURS = 24
@@ -278,41 +278,7 @@ function resolveWorkOrderDeadlineAt(workOrder: WorkOrderRow, now: string): strin
export { settleDueDepositUnfreezes } from './worker-profile-service.js'
export async function settleOverdueWorkOrders(options: { limit?: number; workerId?: number } = {}) {
const overdue = await listOverdueWorkOrders({
limit: Math.max(1, Number(options.limit || 50)),
workerId: Number(options.workerId || 0),
})
let processedCount = 0
let skippedCount = 0
for (const workOrder of overdue) {
const result = await settleOverdueWorkOrder({
workOrderId: workOrder.id,
policy: normalizeWorkOrderTimeoutPolicy(workOrder.timeout_policy),
now: nowIso(),
})
if (result.order) {
processedCount += 1
publishWorkOrderRealtimeChange({
workOrderId: Number(workOrder.id),
workerIds: Number(workOrder.assigned_worker_id)
? [Number(workOrder.assigned_worker_id)]
: [],
hallChanged: result.order.status === WORK_ORDER_STATUS.OPEN,
})
if (Number(workOrder.assigned_worker_id)) {
publishWorkerWalletRealtimeChange(Number(workOrder.assigned_worker_id))
}
} else {
skippedCount += 1
}
}
return {
checkedCount: overdue.length,
processedCount,
skippedCount,
}
}
export { settleOverdueWorkOrders } from './worker-order-timeout-service.js'
export async function listWorkerMyOrders(query: JsonObject = {}, session: WorkerSession) {
requireActiveWorkerSession(session)
@@ -1497,33 +1463,6 @@ export async function collectSubmitWorkOrder(payload: JsonObject = {}) {
}
}
/** 拼单工单同步所有参与打手,避免仅主打手页面更新。 */
async function publishWorkOrderParticipantChange(
workOrderId: number,
options: {
workerIds?: number[]
hallChanged?: boolean
walletChangedWorkerIds?: number[]
} = {},
) {
const shares = await listWorkOrderShares(workOrderId)
const workerIds = [
...(options.workerIds || []),
...shares.map((share) => Number(share.worker_id)),
].filter(
(workerId, index, values) =>
Number.isInteger(workerId) && workerId > 0 && values.indexOf(workerId) === index,
)
publishWorkOrderRealtimeChange({
workOrderId,
workerIds,
...(options.hallChanged ? { hallChanged: true } : {}),
})
for (const workerId of options.walletChangedWorkerIds || []) {
publishWorkerWalletRealtimeChange(workerId)
}
}
export function resolveCollectSubmitTargetWorkOrder(
orderNo: string,
workOrders: WorkOrderRow[],