add:新增同一个工单同一人可以多次拼单

This commit is contained in:
2026-10-23 15:14:07 +08:00
parent bfd2325ac5
commit 1d5615f1ae
18 changed files with 2996 additions and 128 deletions
+8
View File
@@ -0,0 +1,8 @@
/** 客户端幂等键:一次用户点击一个,用于拼单参与/抢单的服务端去重。 */
export function createRequestId(prefix = 'req'): string {
const random =
typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'
? crypto.randomUUID()
: `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`
return `${prefix}-${random}`
}
@@ -89,7 +89,20 @@ export function resolveWorkerMyOrderRealtimeVerdict(input: {
}): { operation: 'upsert' | 'remove'; shouldInsert: boolean } {
const item = isRecord(input.item) ? input.item : {}
const statusFilter = String(input.statusFilter || '')
const statusMatches = !statusFilter || statusFilter === String(item.status || '')
/**
* 服务端快照里的 `workerStatuses` 才是「这张单属于哪些页签」的准确答案。
*
* 同一打手在同一工单可能有多份份额(多次拼单),一张单可以同时出现在「代练中」和「待验收」;
* 而快照的 `status` 只能是一个值。旧逻辑拿单个 status 跟页签比对,只要不相等就删行,
* 于是多份额工单总会在其中一个页签里被删掉(表现为「待验收有时候没有数据」)。
* 老事件/其它来源没有该字段时,退回原来的单状态比对。
*/
const tabs = Array.isArray(item.workerStatuses)
? item.workerStatuses.map((tab) => String(tab || '')).filter(Boolean)
: []
const statusMatches =
!statusFilter ||
(tabs.length > 0 ? tabs.includes(statusFilter) : statusFilter === String(item.status || ''))
const statusProvable = input.explicitOrderNo || statusMatches
const shouldRemove = String(input.operation || '') === 'remove' || !statusProvable