add:新增同一个工单同一人可以多次拼单:拼单后按钮固定显示「再拼一次」

This commit is contained in:
2026-10-23 16:37:59 +08:00
parent 2befb57ef8
commit 7e1e1f7075
7 changed files with 159 additions and 18 deletions
@@ -121,6 +121,13 @@ export function patchWorkerWorkOrderListEnvelope(
current: unknown,
event: WorkerListEvent,
insert = false,
/**
* 就地更新时,快照里没有的「本打手私有字段」保留旧值。
*
* 大厅广播是发给所有打手的通用快照,天然没有 `myShare`/`myShares`(那是每个打手自己的份额)。
* 整行替换会把「再拼一次」冲回「拼单 ¥x/份」,所以覆盖行时必须保留。
*/
preserveFields: readonly string[] = [],
): unknown {
if (!isRecord(current) || !isRecord(current.data) || !Array.isArray(current.data.items)) {
return current
@@ -140,7 +147,14 @@ export function patchWorkerWorkOrderListEnvelope(
(entry) => toNumber((entry as { workOrderId?: unknown })?.workOrderId) === id,
)
if (index >= 0) {
nextItems = items.map((entry, itemIndex) => (itemIndex === index ? event.data : entry))
const existing = items[index]
const merged: Record<string, unknown> = { ...data }
if (isRecord(existing)) {
for (const field of preserveFields) {
if (!(field in merged)) merged[field] = existing[field]
}
}
nextItems = items.map((entry, itemIndex) => (itemIndex === index ? merged : entry))
} else if (insert) {
nextItems = [event.data, ...items]
} else {
@@ -173,12 +187,13 @@ export function patchWorkerWorkOrderInfiniteEnvelope(
current: unknown,
event: WorkerListEvent,
insert = false,
preserveFields: readonly string[] = [],
): unknown {
if (!isRecord(current) || !Array.isArray(current.pages)) return current
return {
...current,
pages: current.pages.map((page: unknown, index: number) =>
patchWorkerWorkOrderListEnvelope(page, event, insert && index === 0),
patchWorkerWorkOrderListEnvelope(page, event, insert && index === 0, preserveFields),
),
}
}