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
@@ -188,3 +188,95 @@ test('非第 1 页不得插入,只做就地更新', () => {
assert.equal(verdict.operation, 'upsert')
assert.equal(verdict.shouldInsert, false)
})
/**
* 同一打手在同一个工单多次拼单:一张单可以同时属于「代练中」和「待验收」,
* 但快照的 status 只能是一个值。前端若按单个 status 删行,另一个页签就会莫名其妙变空
* (线上「待验收有时候没有数据」)。服务端现在带 workerStatuses,按集合判归属。
*/
test('多份额工单:快照 status 是进行中,但属于待验收时不得从待验收页签删行', () => {
const snapshot = buildRow({
status: 'in_progress',
workerStatuses: ['in_progress', 'pending_acceptance'],
})
const verdict = resolveWorkerMyOrderRealtimeVerdict({
item: snapshot,
statusFilter: 'pending_acceptance',
keyword: '',
operation: 'upsert',
page: 1,
explicitOrderNo: false,
})
assert.equal(verdict.operation, 'upsert', '待验收页签必须保留这张多份额工单')
assert.equal(verdict.shouldInsert, true)
const updated = patchWorkerWorkOrderListEnvelope(
buildEnvelope([buildRow({ status: 'pending_acceptance' })]),
{ operation: verdict.operation, data: snapshot },
verdict.shouldInsert,
)
assert.equal(itemsOf(updated).length, 1)
assert.equal((itemsOf(updated)[0] as { status?: string }).status, 'in_progress')
})
test('多份额工单:workerStatuses 同时也是代练中页签的归属依据', () => {
const verdict = resolveWorkerMyOrderRealtimeVerdict({
item: buildRow({
status: 'in_progress',
workerStatuses: ['in_progress', 'pending_acceptance'],
}),
statusFilter: 'in_progress',
keyword: '',
operation: 'upsert',
page: 1,
explicitOrderNo: false,
})
assert.equal(verdict.operation, 'upsert')
})
test('不在页签集合里时才允许删行(例如已验收后离开待验收页签)', () => {
const verdict = resolveWorkerMyOrderRealtimeVerdict({
item: buildRow({ status: 'accepted', workerStatuses: ['accepted'] }),
statusFilter: 'pending_acceptance',
keyword: '',
operation: 'upsert',
page: 1,
explicitOrderNo: false,
})
assert.equal(verdict.operation, 'remove')
assert.equal(verdict.shouldInsert, false)
})
test('VIP 待补图页签也靠 workerStatuses 判定,不会被当成状态不符删掉', () => {
const verdict = resolveWorkerMyOrderRealtimeVerdict({
item: buildRow({ status: 'accepted', workerStatuses: ['accepted', 'vip_evidence_pending'] }),
statusFilter: 'vip_evidence_pending',
keyword: '',
operation: 'upsert',
page: 1,
explicitOrderNo: false,
})
assert.equal(verdict.operation, 'upsert')
})
test('没有 workerStatuses 的旧快照仍按单个 status 比对(保持既有行为)', () => {
const mismatch = resolveWorkerMyOrderRealtimeVerdict({
item: buildRow({ status: 'accepted' }),
statusFilter: 'pending_acceptance',
keyword: '',
operation: 'upsert',
page: 1,
explicitOrderNo: false,
})
assert.equal(mismatch.operation, 'remove')
const match = resolveWorkerMyOrderRealtimeVerdict({
item: buildRow({ status: 'pending_acceptance' }),
statusFilter: 'pending_acceptance',
keyword: '',
operation: 'upsert',
page: 1,
explicitOrderNo: false,
})
assert.equal(match.operation, 'upsert')
})