fix:优化再拼一次bug,优化打手端移动端拼单列表显示
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user