fix:优化再拼一次bug,优化打手端移动端拼单列表显示

This commit is contained in:
2026-10-26 16:36:26 +08:00
parent 2b967ddd4c
commit 7743d2019c
12 changed files with 465 additions and 66 deletions
@@ -36,6 +36,7 @@ import {
pickWorkerRepresentativeShare,
resolveWorkerOrderStatusTabs,
resolveWorkerPermissions,
stripWorkerPersonalShareFields,
} from '../worker-platform/mappers.js'
import { invalidateWorkerMyOrderCaches } from '../worker-platform/worker-my-order-cache.js'
@@ -347,21 +348,27 @@ async function publishWorkOrderSnapshots(input: {
Number(workOrder.sharing_total_quantity || 1),
joinedQuantity,
)
publishRealtimeEvent({
type: 'work_order.changed',
entityId: workOrderId,
scopes: ['worker_hall'],
operation: hallVisible ? 'upsert' : 'remove',
data: hallVisible
? mapWorkOrderForHall(
// 大厅广播是「所有打手通用」的快照:myShare/myShares 是每个打手自己的份额,
// 必须整键剔除,不能带 null/[] 过去。前端补丁对广播行做浅合并,带空值的
// 个人字段会把刚拼单成功写进缓存的份额冲掉,按钮从「再拼一次」变回「拼单」。
const hallSnapshot = hallVisible
? stripWorkerPersonalShareFields(
mapWorkOrderForHall(
workOrder,
{ depositFreeAmount: 0 },
{
// 广播无法按打手等级过滤可见延迟,携带入厅时间由客户端按各自延迟推迟展示。
sharingProgress: { joinedQuantity, pendingSubmissionCount },
},
)
: { workOrderId },
),
)
: null
publishRealtimeEvent({
type: 'work_order.changed',
entityId: workOrderId,
scopes: ['worker_hall'],
operation: hallVisible ? 'upsert' : 'remove',
data: hallSnapshot || { workOrderId },
broadcastWorkers: true,
})
}
@@ -98,6 +98,7 @@ export {
resolveWorkOrderOperationalStatus,
resolveWorkerShareProductName,
resolveWorkerShareStatus,
stripWorkerPersonalShareFields,
} from './work-order-display-mappers.js'
export {
@@ -6,6 +6,7 @@ import {
isWorkerOrderVipEvidencePending,
pickWorkerRepresentativeShare,
resolveWorkerOrderStatusTabs,
stripWorkerPersonalShareFields,
summarizeWorkerShares,
} from './work-order-display-mappers.js'
@@ -248,3 +249,18 @@ test('份额级问题单:已验收份额被标记后只归问题单,母单
})
assert.deepEqual(tabs, ['problem'])
})
test('大厅广播快照必须剔除打手私有份额字段', () => {
const snapshot = stripWorkerPersonalShareFields({
workOrderId: 1,
myShare: null,
myShares: [],
sharingProgress: { joinedQuantity: 2, pendingSubmissionCount: 1 },
})
// 前端对广播行做浅合并:带 null/[] 过去会把缓存里的个人份额冲掉,
// 表现为拼单成功后按钮变回「拼单 ¥x/份」。
assert.equal('myShare' in snapshot, false)
assert.equal('myShares' in snapshot, false)
assert.deepEqual(snapshot.sharingProgress, { joinedQuantity: 2, pendingSubmissionCount: 1 })
assert.equal(snapshot.workOrderId, 1)
})
@@ -605,6 +605,22 @@ export function mapWorkOrderForWorker(
}
}
/**
* 大厅广播快照必须剔除打手私有字段。
*
* 大厅广播是发给所有打手的通用快照,`myShare`/`myShares` 只有本人可见。
* 若原样带 `null`/`[]` 过去,前端 `patchWorkerWorkOrderListEnvelope` 的浅合并
* 会用空值覆盖行上已有的个人份额,按钮从「再拼一次」变回「拼单 ¥x/份」。
*/
export function stripWorkerPersonalShareFields<T extends { myShare?: unknown; myShares?: unknown }>(
snapshot: T,
): Record<string, unknown> {
const result: Record<string, unknown> = { ...snapshot }
delete result.myShare
delete result.myShares
return result
}
/**
* 抢单大厅专用轻量映射。
*