From 48dc5a0c134f84b5fbb427c71ff1317e41573b38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=B9=8F?= Date: Tue, 7 Jul 2026 17:54:48 +0800 Subject: [PATCH] fix: hide assigned orders from dispatch lists --- admin-web/src/api/deliveryApi.test.ts | 30 ++++++++++++++++++++ admin-web/src/api/deliveryApi.ts | 9 ++++++ admin-web/src/views/DeliveryDispatchView.vue | 7 +++-- 3 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 admin-web/src/api/deliveryApi.test.ts diff --git a/admin-web/src/api/deliveryApi.test.ts b/admin-web/src/api/deliveryApi.test.ts new file mode 100644 index 0000000..974c91d --- /dev/null +++ b/admin-web/src/api/deliveryApi.test.ts @@ -0,0 +1,30 @@ +import { describe, expect, it } from 'vitest' +import { filterUnassignedDispatchTargets } from './deliveryApi' +import type { DeliveryOrder } from '../types' + +describe('filterUnassignedDispatchTargets', () => { + it('removes orders already linked to delivery tasks', () => { + const tasks = [ + deliveryTask({ bizType: 'GOODS_ORDER', bizOrderId: 1 }), + deliveryTask({ bizType: 'GROUP_BUY_ORDER', bizOrderId: 3 }) + ] + const orders = [{ id: 1 }, { id: 2 }, { id: 3 }] + + expect(filterUnassignedDispatchTargets(orders, tasks, 'GOODS_ORDER')).toEqual([{ id: 2 }, { id: 3 }]) + expect(filterUnassignedDispatchTargets(orders, tasks, 'GROUP_BUY_ORDER')).toEqual([{ id: 1 }, { id: 2 }]) + }) +}) + +function deliveryTask(overrides: Partial): DeliveryOrder { + return { + id: 1, + bizType: 'GOODS_ORDER', + bizOrderId: 1, + bizOrderNo: 'GO00000001', + riderId: 1, + riderName: 'rider', + amountCent: 0, + status: 'ASSIGNED', + ...overrides + } +} diff --git a/admin-web/src/api/deliveryApi.ts b/admin-web/src/api/deliveryApi.ts index 1265f62..857a507 100644 --- a/admin-web/src/api/deliveryApi.ts +++ b/admin-web/src/api/deliveryApi.ts @@ -21,6 +21,15 @@ export function listDeliveryOrders(status?: string) { return apiGet('/api/admin/delivery-orders', status ? { status } : undefined) } +export function filterUnassignedDispatchTargets( + orders: T[], + tasks: Pick[], + bizType: string +) { + const assignedIds = new Set(tasks.filter((task) => task.bizType === bizType).map((task) => task.bizOrderId)) + return orders.filter((order) => !assignedIds.has(order.id)) +} + export function assignGoodsOrder(orderId: number, riderId: number) { return apiPost('/api/admin/delivery-orders/assign-goods-order', { orderId, riderId }) } diff --git a/admin-web/src/views/DeliveryDispatchView.vue b/admin-web/src/views/DeliveryDispatchView.vue index bdcf482..2ca029e 100644 --- a/admin-web/src/views/DeliveryDispatchView.vue +++ b/admin-web/src/views/DeliveryDispatchView.vue @@ -14,6 +14,7 @@ import { assignGoodsOrder, assignGroupBuyOrder, createDeliveryUser, + filterUnassignedDispatchTargets, listDeliveryOrders, listDeliveryUsers } from '../api/deliveryApi' @@ -44,9 +45,9 @@ async function load() { : [] riders.value = riderRows tasks.value = taskRows - goodsOrders.value = goodsRows - expressOrders.value = expressRows - groupBuyOrders.value = filterPendingDeliveryGroupBuyOrders(groupOrderRows) + goodsOrders.value = filterUnassignedDispatchTargets(goodsRows, taskRows, 'GOODS_ORDER') + expressOrders.value = filterUnassignedDispatchTargets(expressRows, taskRows, 'EXPRESS_ORDER') + groupBuyOrders.value = filterUnassignedDispatchTargets(filterPendingDeliveryGroupBuyOrders(groupOrderRows), taskRows, 'GROUP_BUY_ORDER') if (!dispatchForm.riderId && riderRows[0]) dispatchForm.riderId = riderRows[0].id } catch (error) { ElMessage.error(error instanceof Error ? error.message : '加载失败')