diff --git a/apps/frontend/src/components/WorkOrderEventTimeline.tsx b/apps/frontend/src/components/WorkOrderEventTimeline.tsx index 6418e64e..c2ffd8eb 100644 --- a/apps/frontend/src/components/WorkOrderEventTimeline.tsx +++ b/apps/frontend/src/components/WorkOrderEventTimeline.tsx @@ -40,6 +40,21 @@ function readPayload(event: WorkOrderEvent, key: string): string { return String(value).trim() } +function readPayloadAmount(event: WorkOrderEvent, key: string): number { + return Number(readPayload(event, key) || 0) +} + +function formatFenAmount(value: number) { + return `${(value / 100).toFixed(2)} 元` +} + +/** 事件涉及的打手名(管理端接口会附带打手摘要;打手端退回 #id) */ +function resolveEventWorkerLabel(event: WorkOrderEvent): string { + if (event.worker?.displayName) return event.worker.displayName + const workerId = readPayload(event, 'workerId') + return workerId ? `打手 #${workerId}` : '' +} + /** 事件类型 → 节点阶段文案与颜色 */ export function formatWorkOrderEvent(event: WorkOrderEvent): EventNodeStyle { const type = event.eventType @@ -79,9 +94,9 @@ export function formatWorkOrderEvent(event: WorkOrderEvent): EventNodeStyle { } } case 'assigned_by_admin': { - const workerId = readPayload(event, 'workerId') + const workerLabel = resolveEventWorkerLabel(event) return { - title: `指派打手接手此单${workerId ? `(打手 #${workerId})` : ''}`, + title: workerLabel ? `指派打手接手此单(${workerLabel})` : '指派打手接手此单', description: `订单状态:${formatStatusLabel(event.fromStatus)} → ${formatStatusLabel( event.toStatus, )}`, @@ -90,11 +105,15 @@ export function formatWorkOrderEvent(event: WorkOrderEvent): EventNodeStyle { } case 'unassigned_by_admin': return { title: '取消指派,订单回到未分配状态', color: 'green' } - case 'returned_to_hall_by_admin': + case 'returned_to_hall_by_admin': { + const releaseAmount = readPayloadAmount(event, 'releaseAmount') return { title: note ? `撤回订单到抢单大厅(${note})` : '撤回订单到抢单大厅', + description: + releaseAmount > 0 ? `已退回该打手冻结押金 ${formatFenAmount(releaseAmount)}` : undefined, color: 'green', } + } case 'cancelled_by_worker': return { title: '打手取消接单', color: 'red' } case 'cancel_request_submitted': @@ -177,9 +196,9 @@ export function formatWorkOrderEvent(event: WorkOrderEvent): EventNodeStyle { } } case 'sharing_share_accepted': { - const workerId = readPayload(event, 'workerId') + const workerLabel = resolveEventWorkerLabel(event) return { - title: `拼单份额验收通过并已结算${workerId ? `(打手 #${workerId})` : ''}`, + title: `拼单份额验收通过并已结算${workerLabel ? `(${workerLabel})` : ''}`, color: 'purple', } } @@ -251,8 +270,23 @@ export function formatWorkOrderEvent(event: WorkOrderEvent): EventNodeStyle { } // —— 其他 —— - case 'edited': - return { title: '更改了订单信息', color: 'default' } + case 'edited': { + const productName = readPayload(event, 'productName') + const rewardAmount = readPayloadAmount(event, 'rewardAmount') + const requiredDepositAmount = readPayloadAmount(event, 'requiredDepositAmount') + const timeoutMinutes = readPayloadAmount(event, 'timeoutMinutes') + const changes = [ + productName ? `品名:${productName}` : '', + rewardAmount > 0 ? `报酬 ${formatFenAmount(rewardAmount)}` : '', + requiredDepositAmount > 0 ? `押金 ${formatFenAmount(requiredDepositAmount)}` : '', + timeoutMinutes > 0 ? `时限 ${Math.round(timeoutMinutes)} 分钟` : '', + ].filter(Boolean) + return { + title: '更改了订单信息', + description: changes.length > 0 ? `改为:${changes.join(' · ')}` : undefined, + color: 'default', + } + } case 'sharing_config_updated': return { title: '更新了拼单配置', color: 'default' } case 'price_synced_from_rule': { @@ -266,10 +300,10 @@ export function formatWorkOrderEvent(event: WorkOrderEvent): EventNodeStyle { } } case 'sharing_share_cancelled_by_admin': { - const workerId = readPayload(event, 'workerId') + const workerLabel = resolveEventWorkerLabel(event) const quantity = readPayload(event, 'quantity') return { - title: `撤销拼单参与者${workerId ? `(打手 #${workerId})` : ''}`, + title: `撤销拼单参与者${workerLabel ? `(${workerLabel})` : ''}`, description: `${quantity ? `撤销 ${quantity} 份;` : ''}${note ? `原因:${note}` : '份数已退回接单大厅'}`, color: 'red', } @@ -351,7 +385,7 @@ export default function WorkOrderEventTimeline({ ) : null}