fix:优化再拼一次bug,优化打手端移动端拼单列表显示
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
/**
|
||||
* 抢单大厅专用轻量映射。
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user