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
@@ -155,10 +155,11 @@ export function patchWorkerWorkOrderListEnvelope(
event: WorkerListEvent,
insert = false,
/**
* 就地更新时,快照里没有的「本打手私有字段」保留旧值。
* 就地更新时,快照里没有(或为空)的「本打手私有字段」保留旧值。
*
* 大厅广播是发给所有打手的通用快照,天然没有 `myShare`/`myShares`(那是每个打手自己的份额)。
* 整行替换会把「再拼一次」冲回「拼单 ¥x/份」,所以覆盖行时必须保留。
* 旧版本后端还会显式带 `null`/`[]` 过来;整行替换或直接合并空值都会把
* 「再拼一次」冲回「拼单 ¥x/份」,所以覆盖行时两种情况都要保留。
*/
preserveFields: readonly string[] = [],
/**
@@ -198,7 +199,11 @@ export function patchWorkerWorkOrderListEnvelope(
...(isRecord(event.data) ? event.data : {}),
}
for (const field of preserveFields) {
if (existing && !(field in merged) && field in existing) merged[field] = existing[field]
if (!existing || !(field in existing)) continue
// 快照没有该键,或显式带了 null/[](旧版大厅广播),都视为「没有个人份额信息」。
const incoming = merged[field]
const incomingEmpty = incoming == null || (Array.isArray(incoming) && incoming.length === 0)
if (incomingEmpty) merged[field] = existing[field]
}
nextItems = items.map((entry, itemIndex) => (itemIndex === index ? merged : entry))
} else if (insert) {
@@ -259,6 +264,36 @@ export function sortWorkerHallItems(items: unknown[]): unknown[] {
})
}
/**
* 只把「我的订单」快照里的个人份额字段覆盖到大厅缓存行上。
*
* 大厅广播是发给所有打手的通用快照,已经剔除 myShare/myShares(否则浅合并会
* 冲掉「再拼一次」);但「后台撤销我的份额」「我的份额被验收」这类变化只出现在
* 「我的订单」快照里,需要用后者回填大厅行。这里不增删、不重排,找不到工单就原样返回。
*/
export function patchWorkerHallPersonalShares(
current: unknown,
workOrderId: number,
myShare: unknown,
myShares: unknown,
): unknown {
if (!isRecord(current) || !Array.isArray(current.pages) || workOrderId <= 0) return current
let changed = false
const pages = current.pages.map((page) => {
if (!isRecord(page) || !isRecord(page.data) || !Array.isArray(page.data.items)) return page
let pageChanged = false
const items = page.data.items.map((item) => {
if (!isRecord(item) || toNumber(item.workOrderId) !== workOrderId) return item
pageChanged = true
return { ...item, myShare, myShares }
})
if (!pageChanged) return page
changed = true
return { ...page, data: { ...page.data, items } }
})
return changed ? { ...current, pages } : current
}
/** 无限下拉(大厅):第 1 页允许插入,其余页只做就地更新;最终按置顶优先重排。 */
export function patchWorkerWorkOrderInfiniteEnvelope(
current: unknown,